#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