Question

Exemple:J'ai deux objets partagés (la même chose devrait s'appliquer aux .dll).Le premier objet partagé provient d'une bibliothèque tierce, nous l'appellerons libA.so.J'en ai enveloppé une partie avec JNI et créé ma propre bibliothèque, libB.so.Maintenant, libB dépend de libA.

Lors du démarrage Web, les deux bibliothèques se trouvent dans une zone de travail Webstart.Mon code Java tente de charger libB.À ce stade, le chargeur système tentera de charger libA qui ne se trouve pas dans le chemin de la bibliothèque système (java.library.path n'aidera pas cela).Le résultat final est que libB a un lien insatisfait et ne peut pas être utilisé.

J'ai essayé de charger libA avant libB, mais cela ne fonctionne toujours pas.Il semble que le système d'exploitation veuille effectuer ce chargement pour moi.Existe-t-il un moyen de faire fonctionner cela autrement que par la compilation statique ?

Était-ce utile?

La solution 2

La compilation statique s'est avérée être le seul moyen de démarrer sur le Web plusieurs bibliothèques natives dépendantes.

Autres conseils

Je ne sais pas si cela serait traité exactement de la même manière pour webstart, mais nous avons rencontré cette situation dans une application de bureau lorsque nous traitions avec un ensemble de bibliothèques natives (DLL dans notre cas).

Le chargement de libA avant libB devrait fonctionner, à moins que l'une de ces bibliothèques ait une dépendance qui n'est pas prise en compte et qui ne se trouve pas dans le chemin.Je crois comprendre qu'une fois arrivé à un appel système loadLibrary (c'est-à-direJava a trouvé la bibliothèque dans son java.library.path et demande maintenant au système d'exploitation de la charger) - il dépend entièrement du système d'exploitation pour trouver les bibliothèques dépendantes, car à ce stade, c'est le système d'exploitation qui charge le bibliothèque pour le processus, et le système d'exploitation sait uniquement comment rechercher dans le chemin du système.Cela semble difficile à définir dans le cas d'une application Webstart, mais il existe un moyen de contourner ce problème qui n'implique pas de compilation statique.Vous pourrez peut-être mélanger l'emplacement de vos bibliothèques - je ne suis pas sûr

Si vous utilisez un chargeur de classe personnalisé, vous pouvez remplacer loadLibrary et findLibrary afin qu'il puisse localiser vos bibliothèques à partir d'un fichier jar dans votre chemin de classe, et si vous lui faites également prendre conscience des dépendances de votre bibliothèque native (c'est-à-direlibB dépend de libA dépend de libX, puis lors du chargement de libB, vous pouvez vous rattraper et vous assurer de charger libA en premier, et en vérifiant cet avis et de charger libX en premier.Ensuite, le système d'exploitation n'essaie pas de trouver une bibliothèque qui ne se trouve pas sur votre chemin.C'est fastidieux et un peu pénible, mais s'assurer que Java les trouve et les charge tous dans le bon ordre peut fonctionner.

Les deux bibliothèques natives sont-elles regroupées dans un signé pot qui est répertorié comme

<nativelib ...> 

Dans le fichier JNLP ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top