#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
с одного из зеркал, т.е.
из zip-файла:
binx64tcnative-1.dll