Нативный интерфейс Java 32-битный DLL на 64-битной системе
E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.main(test.java:16)`
При использовании Java Native Interface я столкнулся с проблемой, которая вызвала эту ошибку. Я полагаю, что это потому, что я скомпилировал.dll с MinGW, который компилируется в 32-битный.dll, в то время как моя система 64-битная и, следовательно, моя Java работает на 64-битной. Есть ли способ заставить мою Java работать на 32-битной версии?
6 ответов
Вам нужно будет установить 32-битную JVM, и вы сможете запустить свой код.
Если вы собираетесь распространять свое приложение, вам нужно будет создать как 32-битную, так и 64-битную версии вашей DLL. Затем используйте следующую технику, чтобы загрузить правильную DLL независимо от вашего клиента. Добавьте 32 или 64 (MyJniDLL32.dll & MyJniDLL64.dll) к созданному выходному файлу.
String archDataModel = System.getProperty("sun.arch.data.model");
System.loadLibrary(libraryName+archDataModel);
Просто чтобы заявить об очевидном: чтобы загрузить собственную библиотеку, созданную для 32-битной архитектуры, вы должны заставить JVM запускаться в 32-битном режиме.
java -d32 ...
Возможно, вам нужно установить более старую JVM для вашей платформы (например, Oracle 7 на OS X является только 64-битной, вам нужно получить Apple 6 от Apple из их базы знаний).
Я получил то же сообщение об ошибке (без отслеживания стека) после установки плагина Java для браузера Chrome.
Переустановка JDK/JRE (это среда разработки) исправила это для меня.
- Загрузите mingw-w64.
- Обновите переменную среды PATH.
- Создайте программу на языке C с именем test.c, которая имеет реализацию для вашего метода.
Запустите следующий cmd в командной строке
gcc -Wl, -add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o test.dll test.c
IA - это архитектура Itanium, поэтому AMD jvm пытается загрузить dll, созданную для Itanium... не думаю, что это сработает.
Библиотеки работают под управлением родной ОС. Java просто делегирует вызов DLL, которая очень тесно связана с ОС, на которой она скомпилирована. В общем, вы не можете сделать это прямым способом, и вот способ.
Но есть обходные пути, такие как WOW64, что делает это возможным. Пожалуйста, проверьте эти ссылки ( 1, 2)