JAVA/JNI — загрузить собственную DLL с циклической зависимостью

Я пытаюсь загрузить код С++ в свой проект Java с помощью JNI. У меня есть несколько DLL для загрузки, и, к сожалению, существует циклическая зависимость между двумя из них: dll A нужна dll B, которая, в свою очередь, нуждается в dll A! Я знаю, что круговые зависимости между DLL — это плохой дизайн программирования, но в моем проекте код C++ для меня — черный ящик.

Есть ли способ загрузить DLL с циклической зависимостью?

Спасибо за вашу помощь.

jpsi

Подробности:

Мой код довольно прост:

System.loadLibrary("myDLLA"); // needs dll B to be loaded!
System.loadLibrary("myDLLB"); // needs dll A to be loaded!
System.loadLibrary("myDLLC"); // needs dll B
// then call my native method implemented in dll C

Путь к библиотеке Java в порядке и содержит две DLL (он указан как аргумент виртуальной машины, я его сбросил и проверил во время выполнения). Циклическая зависимость была подтверждена Dependendcy Walker.

Ошибка:

java.lang.UnsatisfiedLinkError: E:\...\myDLLA.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1928)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)

Мой проект разработан в Eclipse (Helios) как динамический веб-проект, развернутый на сервере tomcat 6.

Пожалуйста, сообщите мне, если вам нужна дополнительная информация.

Еще раз спасибо за любую помощь!!


person jpsi    schedule 26.03.2013    source источник


Ответы (1)


В Windows загрузчик DLL будет следовать ПУТИ для разрешения внешних ссылок. Вы можете добавить каталог myDLLB.dll в PATH глобально (через Свойства системы-> дополнительно), или в командной строке, которая запускает ваше приложение Java (set или xset), или из кода Java.

person Alex Cohn    schedule 26.03.2013
comment
Спасибо за Ваш ответ. Я пробовал, но это не сработало (та же ошибка). Насколько я понимаю, проблема не в том, где найти dll (в любом случае с java.library.path все в порядке, но я пробовал и с каталогом в PATH env var), а в порядке загрузки: System. loadLibrary должен загрузить dll ПОСЛЕ своих зависимостей, но здесь есть циклическая зависимость... - person jpsi; 26.03.2013
comment
Ну, я не знаю, как вы устанавливаете переменную среды PATH, и да, это может быть сложно. Мой простой тест показывает, что установка CurrentDirectory внутри программы не влияет на путь поиска собственного загрузчика lib, и я не пытался изменить PATH внутри программы. Но установив переменную среды PATH для включения каталога myDLLA.dll, я без проблем смог загрузитьLibrary(myDLLB). - person Alex Cohn; 27.03.2013
comment
Как вы сделали свой простой тест? - person jpsi; 29.03.2013
comment
После того, как вы измените свойства системы, вы должны перезагрузиться или, по крайней мере, выйти из системы / войти в систему, чтобы изменения вступили в силу в вашей программе. Я использовал Eclipse, который позволяет переопределить среду для запуска проекта. Обратите внимание, что вы также можете поместить DLL в текущий каталог программы (но изменение user.dir так, чтобы оно указывало на DLL после запуска, не помогло). - person Alex Cohn; 30.03.2013