[java] Невозможно загрузить IA 32-bit .dll на 64-разрядную платформу AMD



Answers

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

Question

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

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

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

... lib \ JNI_SVM-light-6.01 \ lib \ svmlight.dll: Не удается загрузить IA 32-bit .dll IA на 64-разрядную платформу AMD

Могу ли я решить эту проблему, перекомпилировав DLL для 64-битного? Как мне это сделать? Есть ли другой способ обхода? SVMLight делает исходный код C доступным.




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

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

>javac MyProgramWith32BitNativeLib.java

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

Я отправлю пример кода для Windows , так как это, похоже, ОС, используемая OP.

Windows

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

>"C:\Program Files (x86)\Java\jre#.#.#_###\bin\java.exe" MyProgramWith32BitNativeLib 

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

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

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

C:\Users\me\MyProject>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:\Users\me\MyProject>

Поэтому я знаю, что мои номера 1.8.0_111 , и моя команда

C:\Users\me\MyProject>"C:\Program Files (x86)\Java\jre1.8.0_111\bin\java.exe" MyProgramWith32BitNativeLib



Получил это от - 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 );



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

 INFO pool-15-thread-1 com.home.launcher.CommandLauncher - Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\....\lib\Data 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 и установил следующий

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

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

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

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

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




Имел такой же вопрос в win64bit и JVM 64bit

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




Links