Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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?