Подтвердить что ты не робот

32-разрядная dll для интерфейса Java для 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-битами?

4b9b3361

Ответ 1

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

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

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);

Ответ 2

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

java -d32 ...

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

Ответ 3

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

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

Ответ 4

  • Загрузите 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

Ответ 5

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

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

Ответ 6

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

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