Comment puis-je démarrer sur le Web Java plusieurs bibliothèques natives dépendantes ?

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'ai enveloppé une partie de cela 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 sont placées 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 non satisfait 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 faire ce chargement pour moi. Existe-t-il un moyen de faire fonctionner cela autrement qu'en compilant statiquement ?

请先 登录 后评论

3 réponses

Joshua McKinnon

Je ne sais pas si cela serait géré 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, sauf si l'une de ces bibliothèques a une dépendance qui n'est pas prise en compte et qui n'est pas dans le chemin. Ma compréhension est qu'une fois qu'il arrive à un appel système loadLibrary (c'est-à-dire que Java a trouvé la bibliothèque dans son java.library.path et dit maintenant au système d'exploitation de la charger) - il dépend complètement du système d'exploitation pour trouver toutes les bibliothèques dépendantes , car à ce stade, c'est le système d'exploitation qui charge la bibliothèque pour le processus, et le système d'exploitation ne sait que regarder 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 cela qui n'implique pas de compilation statique. Vous pourrez peut-être mélanger où se trouvent 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 jar dans votre chemin de classe, et si vous lui faites également prendre conscience de vos dépendances de bibliothèque natives (c'est-à-dire que libB dépend de libA dépend sur libX, alors lors du chargement de libB, vous pouvez vous rattraper et vous assurer de charger libA en premier, et en vérifiant cet avis et en chargeant libX en premier. Ensuite, le système d'exploitation n'essaie pas de trouver une bibliothèque qui n'est pas dans votre chemin. C'est maladroit et un peu pénible, mais s'assurer que Java les trouve et les charge tous dans le bon ordre peut fonctionner.

请先 登录 后评论
Adam Mitz

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

<nativelib ...> 

Dans le fichier JNLP ?

请先 登录 后评论
basszero

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

请先 登录 后评论
  • 25 abonnés
  • 0 favoris,328 Feuilleter
  • basszero posée à 2023-03-17 20:01