Нативный интерфейс Java 32-битный DLL на 64-битной системе - PullRequest
27 голосов
/ 18 марта 2012
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 ]

26 голосов
/ 18 марта 2012

Вам нужно будет установить 32-битную JVM, и вы сможете запустить свой код.

Если вы собираетесь распространять свое приложение, вам нужно будет создать как 32-битную, так и 64-битную версии вашей DLL. Затем используйте следующую технику, чтобы загрузить правильную DLL независимо от вашего клиента. Добавьте 32 или 64 (MyJniDLL32.dll & MyJniDLL64.dll) к созданному выходному файлу.

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);
8 голосов
/ 27 марта 2014

Просто чтобы заявить очевидное: чтобы загрузить собственную библиотеку, созданную для 32-битной архитектуры, вы должны принудительно запустить JVM в 32-битном режиме.

java -d32 ...

Возможно, вам нужно установить более старую JVM дляваша платформа (например, Oracle 7 на OS X является только 64-битной, вам нужно получить Apple 6 от Apple из их базы знаний).

1 голос
/ 27 января 2017
  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

1 голос
/ 30 сентября 2013

Я получил то же сообщение об ошибке (без трассировки стека) после установки плагина Java для браузера Chrome.

Повторная установка JDK / JRE (это среда разработки) исправила его для меня.

0 голосов
/ 21 сентября 2012

IA - это архитектура Itanium, поэтому AMD jvm пытается загрузить dll, созданную для Itanium ... не думаю, что это сработает.

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

0 голосов
/ 18 марта 2012

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

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

...