Как я могу запустить на Java несколько зависимых нативных библиотек?

Пример: у меня есть два общих объекта (один и тот же должен применяться к .dll). Первый общий объект из сторонней библиотеки, мы назовем его libA.so. Я обернул кое-что из этого с помощью JNI и создал свою собственную библиотеку, libB.so. Теперь libB зависит от libA.

При запуске веб-сайта обе библиотеки размещаются в некоторой рабочей области веб-запуска. Мой код Java пытается загрузить libB. В этот момент системный загрузчик попытается загрузить libA, которого нет в пути к системной библиотеке (java.library.path не поможет). Конечным результатом является то, что libB имеет неудовлетворенную ссылку и не может использоваться.

Я пытался загрузить libA до libB, но это все равно не работает. Кажется, ОС хочет сделать эту загрузку для меня. Есть ли способ сделать эту работу, кроме статической компиляции?

7.08.2008 12:26:50
3 ОТВЕТА

Я не уверен, будет ли это обрабатываться точно так же для веб-запуска, но мы столкнулись с такой ситуацией в настольном приложении, когда имели дело с набором нативных библиотек (dll в нашем случае).

Загрузка libA до libB должна работать, если только одна из этих библиотек не имеет зависимостей, которые не указаны и отсутствуют в пути. Насколько я понимаю, как только он добирается до системного вызова loadLibrary (т. Е. Java нашла библиотеку в своем java.library.path и теперь сообщает ОС, чтобы загрузить ее) - она ​​полностью зависит от операционной системы, чтобы найти любые зависимые библиотеки. потому что в этот момент именно операционная система загружает библиотеку для процесса, а ОС знает только, как искать в системном пути. Это кажется трудно установить в случае приложения Webstart, но есть способ обойти это, не включая статическую компиляцию. Вы можете перетасовать, где находятся ваши библиотеки - я не уверен

Если вы используете пользовательский загрузчик классов, вы можете переопределить loadLibrary и findLibrary, чтобы он мог найти ваши библиотеки внутри jar-файла в вашем пути к классам, и если вы также сделаете так, чтобы он знал о ваших собственных зависимостях библиотеки (то есть libB зависит от libA, зависит от libX, затем при загрузке libB вы можете поймать себя и убедиться, что вы сначала загрузили libA, а также проверили это уведомление и сначала загрузили libX. Затем ОС не пытается найти библиотеку, которой нет у вас на пути. Это клёво и немного болезненно. , но может гарантировать, что Java найдет их и загрузит их в правильном порядке.

7
7.08.2008 17:53:38
Загрузчики классов не могут решить проблему, так как ОС разрешает собственные зависимости.
basszero 26.01.2009 01:46:17

Упакованы ли обе нативные библиотеки в подписанный jar, который указан как

<nativelib ...> 

В файле JNLP?

1
17.09.2008 06:32:00
РЕШЕНИЕ

Статическая компиляция оказалась единственным способом запустить несколько зависимых нативных библиотек.

4
26.01.2009 01:47:13