Не удается загрузить 32-разрядную IA.dll на 64-разрядной платформе AMD

#java #windows #dll #java-native-interface

#java #Windows #dll #java-native-interface

Вопрос:

Я пытаюсь использовать SVMlight из Java, используя оболочку JNI на этой странице:

   static {
    System.loadLibrary("lib/JNI_SVM-light-6.01/lib/svmlight");
  }
  

Я получаю следующую ошибку:

… libJNI_SVM-light-6.01libsvmlight.dll : Не удается загрузить 32-разрядную IA.dll на 64-разрядной платформе AMD

Могу ли я решить это путем перекомпиляции .dll для 64-разрядной версии? Как бы мне это сделать?Могу ли я использовать какой-либо другой обходной путь? SVMlight делает доступным исходный код C.

Ответ №1:

Да, вам придется перекомпилировать DLL для 64-разрядной версии. Ваш единственный другой вариант — переключиться на 32-разрядную JVM или иным образом заставить какой-либо 32-разрядный процесс загружать DLL от вашего имени и каким-то образом взаимодействовать с этим процессом.

Комментарии:

1. Как я могу переключиться на 32-разрядную JVM? Это аргумент, который я могу передать, или мне нужно загрузить и настроить что-то новое?

2. Загрузите и установите 32-разрядную jvm.

3. @Rosarch: Да, 64-разрядная машина может запускать 32-разрядные исполняемые файлы. Это будет самый простой способ заставить работать 32-разрядную DLL.

4. «Да, вам придется перекомпилировать DLL для 64-разрядной версии». Как?

5. @JohnPerry вы должны быть автором библиотеки DLL или иметь доступ к кодовой базе библиотеки DLL. Обычно для компиляции в динамически связанную библиотеку используется CMake или Visual Studio.

Ответ №2:

У меня была такая же проблема с приложением Java, использующим tibco dll, изначально предназначенным для запуска на Win XP. Чтобы заставить ее работать в Windows 7, я настроил приложение на 32-разрядную JRE. Жду, есть ли другое решение.

Комментарии:

1. Привет, не могли бы вы подробнее рассказать о том, как вы заставили свое приложение указывать на 32-разрядную JRE? Это что-то, что вы сделали в своей IDE или программно?

Ответ №3:

Краткий ответ на первый вопрос: да.

Более длинный ответ: возможно; это зависит от того, работает ли процесс сборки для SVMlight в 64-разрядной Windows.

Последнее замечание: этот вызов System.LoadLibrary глуп. Либо вызовите System.load с полным путем, либо позвольте ему выполнить поиск java.library.path.

Комментарии:

1. Я задал несколько вопросов. На что вы отвечаете «да»? ха.

Ответ №4:

Была такая же проблема в win64bit и 64-разрядной JVM

Было решено путем загрузки dll в system32

Комментарии:

1. это невозможно, расположение файла ничего не меняет

Ответ №5:

Убедитесь, что вы указываете ПУТЬ к Program Files (x86), а не Program Files. Это решило мою проблему.

Комментарии:

1. Может быть, вы имеете в виду «использовать jvm, которая находится в Program Files (x86), чтобы убедиться, что это 32-разрядная версия»??

Ответ №6:

Получил это от — http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically /

Если задан java.library.path, для работы должны быть следующие строки.

 Field fieldSysPath;
fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
  

Ответ №7:

Перейдите к

Свойства проекта >> Выполнить >> Параметры виртуальной машины

и укажите этот адрес:

 -Djava.library.path="C:opencvbuildjavax64"
  

Ответ №8:

Просто перейдите к install download jdk_x86, и она установится в Program Files (x86) и укажите путь jre в вашем проекте. Вот и все.

Ответ №9:

У меня возникла проблема при запуске red5 (tomcat) в Windows x64, который ранее работал под Windows x32, получил следующую ошибку:

  INFO pool-15-thread-1 com.home.launcher.CommandLauncher - Exception in thread "main" java.lang.UnsatisfiedLinkError: C:....libData Samolet.dll: Can't find dependent libraries
INFO pool-15-thread-1 com.home.launcher.CommandLauncher - at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  

Проблема решена, когда я установил версию Java x32 и установил next

«Переменные среды»

«Пользовательские переменные для Home»

JAVA_HOME => C:Program Files (x86) Java jdk.1.6.0_45

«Системные переменные»

Путь [в начале] => C:Program FilesJava jdk.1.8.0_60;..

Ответ №10:

Вот ответ для тех, кто компилирует из командной строки / Command Prompt. Это не требует изменения вашей Path переменной окружения; это просто позволяет вам использовать 32-разрядную JVM версию для программы с 32-разрядной DLL .

Для компиляции не должно иметь значения, что javac используется — 32-разрядная или 64-разрядная версия.

 >javac MyProgramWith32BitNativeLib.java
  

Для фактического выполнения программы важно указать путь к 32-разрядной версии java.exe

Я опубликую пример кода для Windows , поскольку, похоже, это операционная система, используемая операционной системой.

Windows

Скорее всего, код будет выглядеть примерно так:

 >"C:Program Files (x86)Javajre#.#.#_###binjava.exe" MyProgramWith32BitNativeLib 
  

Разница будет в числах после jre . Чтобы найти, какие номера следует использовать, введите:

 >dir "C:Program Files (x86)Java"
  

На моей машине процесс выглядит следующим образом

 C:UsersmeMyProject>dir "C:Program Files (x86)Java"
 Volume in drive C is Windows
 Volume Serial Number is 0000-9999

 Directory of C:Program Files (x86)Java

11/03/2016  09:07 PM    <DIR>          .
11/03/2016  09:07 PM    <DIR>          ..
11/03/2016  09:07 PM    <DIR>          jre1.8.0_111
               0 File(s)              0 bytes
               3 Dir(s)  107,641,901,056 bytes free

C:UsersmeMyProject>
  

Итак, я знаю, что мои числа 1.8.0_111 , а моя команда

 C:UsersmeMyProject>"C:Program Files (x86)Javajre1.8.0_111binjava.exe" MyProgramWith32BitNativeLib
  

Ответ №11:

Не беспокойтесь о том, что вам следует просто измениться .dll от x64 до x86, в собственной библиотеке.

например: — возможно, вы выбрали это (C:opencvbuildjavax64 ).

вместо этого вы выбираете это для собственной библиотеки (C:opencvbuildjavax86 ).

Ответ №12:

Для расположения собственной библиотеки используйте X64 вместо X86. По крайней мере, это устранило проблему, которая у меня была.

Ответ №13:

На моем ноутбуке с Windows установлены оба клиента 32 и 64 разрядных версий, с которыми я внезапно начал сталкиваться, затем я изменил порядок переменной path, как показано ниже

Перед:

 C:apporacle64product12.1.0client_1bin;
C:apporacle32product12.1.0client_1bin;
  

После:

 C:apporacle32product12.1.0client_1bin;
C:apporacle64product12.1.0client_1bin;
  

начал работать… Надеюсь, это поможет всем.

Ответ №14:

У меня возникла проблема, связанная с этим, и я читал

 "Exception in thread "main" java.lang.UnsatisfiedLinkError: C:opencvbuildjavax86opencv_java2413.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform "
  

и мне потребовалась целая ночь, чтобы разобраться.

Я решил свою проблему, скопировав dll из C:opencvbuildjavax64 в свою папку system32. Я надеюсь, что это кому-нибудь поможет.

Ответ №15:

сборка для Win64 не требуется.

Загрузите 64-кратную версию на https://tomcat.apache.org/download-native.cgi

с одного из зеркал, т.е.

https://mirror.checkdomain.de/apache/tomcat/tomcat-connectors/native/1.2.28/binaries/tomcat-native-1.2.28-openssl-1.1.1k-win32-bin.zip

из zip-файла:

binx64tcnative-1.dll