Нативный интерфейс 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 (это среда разработки) исправила это для меня.

  1. Загрузите mingw-w64.
  2. Обновите переменную среды PATH.
  3. Создайте программу на языке C с именем test.c, которая имеет реализацию для вашего метода.
  4. Запустите следующий 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... не думаю, что это сработает.

http://en.wikipedia.org/wiki/Itanium

Библиотеки работают под управлением родной ОС. Java просто делегирует вызов DLL, которая очень тесно связана с ОС, на которой она скомпилирована. В общем, вы не можете сделать это прямым способом, и вот способ.

Но есть обходные пути, такие как WOW64, что делает это возможным. Пожалуйста, проверьте эти ссылки ( 1, 2)

Другие вопросы по тегам