Вопрос по java – JNI-зависимые библиотеки

14

Я запускаю библиотеку через JNI (я ее не писал), и внутренне она вызывает другую DLL. Я получаю сообщение об ошибке "Не могу найти зависимые библиотеки" если я не добавлю путь к другой DLL в системную переменную PATH (я в Windows XP). Я хотел бы иметь возможность обрабатывать это в командной строке Java, и я уже пытался добавить его в -Djava.library.path и в classpath, но это не сработало (я ожидал, что -Djava.library.path будет работать но не classpath, но ни сработало). Есть ли способ сделать это?

Спасибо,

Джефф

Ваш Ответ

4   ответа
6

в переменной PATH, используя System.load () для всех библиотек DLL в обратном порядке зависимости. Просто чтобы прояснить, я вызывал System.load () для всех зависимых DLL, а не только для JNI DLL. Вам не нужно вызывать System.load () для библиотек DLL, которые поставляются с Windows (они находятся в PATH).

Я делал это в веб-приложении, где jar содержал DLL, которые распаковывались. Ваша ситуация кажется проще, поэтому я считаю, что это должно сработать. Я обычно следовал решению здесь:Как сделать файл JAR, который включает файлы DLL?

18
If you have a DLL name 'MyNativeDLL.dll' then you should use 'MyNativeDLL' in your LoadLibrary call. Use Dependency Walker to check if there are any files required by MyNativeDLL.dll If there are, include them in the same folder as MyNativeDLL.dll - one you get it working try putting the additional required files in System32 folder.
Error: User Rate Limit Exceeded Jeff Storey
Error: User Rate Limit Exceeded Jeff Storey
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

используя JNA. Это можно использовать в качестве обходного пути, если вы хотите развернуть зависимые библиотеки DLL вместе с приложением, не портя глобальную среду или не нарушая явный порядок загрузки DLL.

Однако мне не ясно, как жизненный цикл загрузчика классов влияет на это. Я пробовал этот метод только в модульной системе NetBeans, но если вы посмотрите на код класса ClassLoader для loadLibrary, вы увидите, что он кэширует некоторые переменные пути. Может возникнуть или не возникнуть необходимость в создании нового загрузчика классов для загрузки библиотеки.

Недостатком является то, что вам нужно использовать JNA или JNI. Кроме того, это похоже на довольно грубый хак. УвидетьВот для примера того, как установить переменную окружения, используя JNA.

2

Также удалось загрузить dll JNI, созданную с помощью cygwin:

первый:

/* conditioned if OS is windows because also need it to work in Linux env. */ 
System.loadLibrary("cygwin1"); 

затем:

System.loadLibrary("mylib"); 

В Windows это требует либо установки java.library.path, чтобы они совпадали с расположением обеих библиотек.

При запуске из Eclipse этот параметр может быть заменен на «Расположение собственных библиотек». в пути сборки Java (в настройках библиотек JRE).

Однако все же найти это немного сложнее.

Похожие вопросы