Как я могу запустить на Java несколько зависимых родных библиотек? - PullRequest
15 голосов
/ 07 августа 2008

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

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

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

Ответы [ 3 ]

6 голосов
/ 07 августа 2008

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

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

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

3 голосов
/ 26 января 2009

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

1 голос
/ 17 сентября 2008

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

<nativelib ...> 

В файле JNLP?

...