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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Являются ли обе родные библиотеки упакованы в подписанную банку, которая указана как

<nativelib ...> 

В файле JNLP?