Java JNI и зависимые библиотеки в Windows
Короче говоря: у меня есть исполняемая банка, которая вызывает jni.dll
, которая зависит от lib.dll
. И я получаю о-о-боязнь UnsatisfiedLinkError
.
Ответ на этот вопрос довольно близок, но мне не удается решить эту проблему из моего опыта. Даже если папка, в которой находится dll, указана в java.library.path
, она не будет работать. Мне также нужно изменить переменную среды Windows PATH
. Фактически, по умолчанию java.library.path
в Windows выглядит как PATH
.
Есть ли какой-нибудь "симпатичный" способ исправить это? Я хочу создать установщик для Windows, и мне интересно, как я буду справляться с этой проблемой, чтобы конечный пользователь не должен был выполнять какую-либо ручную работу.
EDIT:
Я реализовал следующее: приложение поставляется с папкой "native_libs", которая имеет динамические библиотеки для всех поддерживаемых архитектур. Структура следующая:
/
+- native_libs/
+- windows/
| +- x86/
| | +- ...
| +- x64/
| +- ...
|
+- linux/
| +- x86/
| | +- ...
| +- x64/
| +- ...
|
+- libs/
+- ...
Во время выполнения, в то время как приложение инициализируется, обнаруживаются правильная архитектура JRE и системная ОС и файлы библиотеки копируются в папку libs/. java.library.path
также устанавливается во время выполнения, используя обычный хак. Наконец, переменная среды PATH
для окон устанавливается с помощью встроенного средства запуска.
Есть ли возможности для улучшения? Возможно, копирование dll в том же каталоге, что и файл jar
, будет отрицать необходимость установки переменных java.library.path
и PATH
? Мне нужно также изучить загрузку dll с помощью System.load()
, что отрицает необходимость копирования файлов.
Ответы
Ответ 1
java.library.path
указывает каталоги, в которых System.loadLibrary()
ищет файл динамической библиотеки. Если вы измените системное свойство java.library.path
в своем коде, это не будет иметь никакого эффекта. Есть хаки, чтобы заставить Java "забыть" начальное значение и переоценить содержимое системного свойства java.library.path
.
Однако зависимая библиотека не загружается Java, она загружается Windows. Windows не заботится о java.library.path
, она заботится только о переменной среды PATH
. Ваш единственный вариант - настроить PATH
для вашего Java-процесса. Например, если вы запустите его из командного файла, измените переменную среды PATH
прямо перед вызовом java.
Ответ 2
Самое простое решение - обеспечить, чтобы все .dll находились в '.' при выполнении.
Ответ 3
Если проблема в том, что os не может найти библиотеку зависимостей, попробовали ли вы загрузить ее через System.loadLibrary()
перед загрузкой основной библиотеки?
Ответ 4
Поместите dll, на которые зависит ваш jni.dll в вашем "текущем рабочем каталоге", проверьте этот System.getProperty("user.dir")
во время выполнения, чтобы узнать, что является вашим текущим рабочим каталогом