Родная библиотека Java JNI загружается на 64-битных и 32-битных, но не работает на 32-битных

#java #java-native-interface #mingw #32bit-64bit #unsatisfiedlinkerror

#java #java-native-interface #mingw #32-битный-64-битный #ошибка неудовлетворительной ссылки

Вопрос:

У меня есть приложение JNI, работающее на моем основном компьютере с 64-разрядной версией Windows 7, но оно не работает на моем ноутбуке с 32-разрядной версией Windows XP. На ноутбуке 32-разрядная версия собственной библиотеки DLL загружается без an UnsatisfiedLinkError , но я получаю сообщение об ошибке при вызове фактического собственного метода. Вот как я компилирую свои библиотеки DLL с помощью MinGW:

 cd bin
javah MyClass
move /Y MyClass.h ../
"%mingw64%bing  " -shared -I"C:Program FilesJavajdk1.8.0_05include" -I"C:Program FilesJavajdk1.8.0_05includewin32" -o src/lib/MyLibrary.dll MyClass.cpp
@echo "Making the 32-bit library..."
g   -shared -I"C:Program FilesJavajdk1.8.0_05include" -I"C:Program FilesJavajdk1.8.0_05includewin32" -o src/lib/MyLibrary_32.dll MyClass.cpp
 

Вот код, который я использую для загрузки библиотеки, которая технически работает на обоих процессорах.

     String processor = System.getProperty("sun.arch.data.model").equals("32") ? new String("_32") : new String("");
    try { System.load(System.getProperty("user.dir")   "\MyLibrary"   processor   ".dll"); }
    catch(UnsatisfiedLinkError e) {
        //If the dll was not found, extract the one packaged as a resource in the .jar
        InputStream in = ML_Overworld.class.getClassLoader().getResourceAsStream("lib/MyLibrary"   processor   ".dll");
        if(in == null) {
            printError(String.format("MyLibrary%s.dll was not contained in the jar.", processor));
            return;
        }
        File outPath = new File(System.getProperty("user.dir")   "\MyLibrary"   processor   ".dll");
        try {
            DataOutputStream out = new DataOutputStream(new FileOutputStream(outPath));
            try {
                int input;
                while((input = in.read()) != -1)
                    out.write(input);
                out.close();
                in.close();
            }
            catch(IOException e2) {
                printError(String.format("MyLibrary%s.dll failed to extract: ", processor)   e2.getMessage()   ".");
                return;
            }
        }
        catch(FileNotFoundException e3) {
            printError(String.format("MyLibrary%s.dll failed to extract: ", processor)   e3.getMessage()   ".");
            return;
        }
        try { System.load(System.getProperty("user.dir")   "\MyLibrary"   processor   ".dll"); }
        catch(UnsatisfiedLinkError e4) {
            printError(String.format("MyLibrary%s.dll failed to load: ", processor)   e4.getMessage()   ".");
            return;
        }
    }
 

И для справки, вот собственный метод, который выдает Unsatisfied Link Error на 32-разрядном ноутбуке:
public static native void readMap(String path, cMap m);


[решение]: добавлено --kill-at к аргументам g при компиляции 32-разрядной DLL.

Комментарии:

1. Запуск зависит от вашей 32-разрядной dll. Похоже, чего-то не хватает. Что такое g против «%mingw64% bin g «? Вы пробовали g -m32?

2. Стандартный MinGW только 32-разрядный. MinGW-64 — это отдельное приложение на другом веб-сайте: mingw-w64.sourceforge.net . Загрузка обычной скомпилированной DLL-библиотеки g на моем 64-разрядном компьютере приводит к ошибке несовместимости.

3. Исправлено редактирование основного сообщения с решением.

4. Страница руководства для —kill-at