Ответ 1
Да, вам придется перекомпилировать DLL для 64-битного. Единственный другой вариант - переключиться на 32-разрядную JVM или получить 32-разрядный процесс для загрузки DLL от вашего имени и как-то связаться с этим процессом.
Я пытаюсь использовать 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-разрядную .dll на 64-битной платформе AMD
Могу ли я решить эту проблему, перекомпилировав DLL для 64-битного? Как я могу это сделать? Есть ли другой способ обхода? SVMLight делает исходный код C доступным.
Да, вам придется перекомпилировать DLL для 64-битного. Единственный другой вариант - переключиться на 32-разрядную JVM или получить 32-разрядный процесс для загрузки DLL от вашего имени и как-то связаться с этим процессом.
У меня была такая же проблема с приложением Java, использующим dll tibco, первоначально предназначенную для запуска в Win XP. Чтобы заставить его работать в Windows 7, я применил приложение к 32-разрядной JRE. Ожидание, есть ли другое решение.
Короткий ответ на первый вопрос: да.
Более длинный ответ: возможно; это зависит от того, ведет ли процесс сборки SVMLight себя в 64-битных окнах.
Заключительное примечание: этот вызов в System.loadLibrary глуп. Либо вызовите System.load с полным именем пути, либо пусть он будет искать java.library.path.
Была ли такая же проблема в win64bit и JVM 64bit
Была решена путем загрузки dll в system32
Убедитесь, что вы устанавливаете PATH в Program Files (x86) не Program Files. Это решило мою проблему.
Получил это от - 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 );
Перейдите к
Свойства проекта → Выполнить → Параметры VM
и поместите этот адрес:
-Djava.library.path="C:\opencv\build\java\x64"
У меня возникла проблема при запуске 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;..
У меня была проблема, связанная с этим, и я читал
"Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\opencv\build\java\x86\opencv_java2413.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform "and it took me an entire night to figure out.
Я решил свою проблему, скопировав dll в C:\opencv\build\java\x64
в папку system32. Надеюсь, это поможет кому-то.
Вот ответ для тех, кто компилируется из командной строки /Command Prompt. Это не требует изменения вашей переменной среды Path
; он просто позволяет использовать 32-разрядный JVM
для программы с 32-разрядным DLL
.
Для компиляции не имеет значения, какой из javac
используется - 32-разрядный или 64-разрядный.
>javac MyProgramWith32BitNativeLib.java
Для фактического выполнения программы важно указать путь к 32-разрядной версии java.exe
Я отправлю пример кода для Windows
, так как это, похоже, ОС, используемая OP.
Окно
Скорее всего, код будет выглядеть примерно так:
>"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
Просто зайдите, чтобы установить загрузку jdk_x86 и установить ее в Program Files (x86) и установить путь jre в вашем проекте. Это оно.
Не беспокойтесь о том, что вам нужно просто изменить .dll с x64 на x86 в собственной библиотеке.
например: - вы могли выбрать это (C:\opencv\build\java\x64).
вместо этого вы выбираете это для собственной библиотеки (C:\opencv\build\java\x86).
Мой ноутбук с Windows имеет 32 и 64 битные клиенты, с которыми я столкнулся внезапно, затем я переупорядочил переменную пути, как показано ниже
До:
C:\app\oracle64\product\12.1.0\client_1\bin;
C:\app\oracle32\product\12.1.0\client_1\bin;
После:
C:\app\oracle32\product\12.1.0\client_1\bin;
C:\app\oracle64\product\12.1.0\client_1\bin;
начал работать... Надеюсь, это поможет всем.
Для вашей нативной библиотеки, используйте X64 поверх X86. По крайней мере, эта исправленная проблема у меня была.