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") во время выполнения, чтобы узнать, что является вашим текущим рабочим каталогом