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

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

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

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

Ответов (3)

Решение

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

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

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

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

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

<nativelib ...> 

В файле JNLP?