17 votes

Comment puis-je Java webstart plusieurs bibliothèques natives dépendantes ?

Exemple : J'ai deux objets partagés (même chose devrait s'appliquer aux .dlls). 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.

Lorsqu'il démarre via le web, les deux bibliothèques sont placées dans un espace de travail webstart. Mon code java tente de charger libB. À ce stade, le chargeur du système tentera de charger libA qui n'est pas dans le chemin de bibliothèque du 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. Y a-t-il un moyen de faire fonctionner cela autrement que par une compilation statique ?

8voto

Joshua McKinnon Points 12379

Je ne suis pas sûr que cela soit géré exactement de la même manière pour Webstart, mais nous avons rencontré cette situation dans une application de bureau lors de la gestion d'un ensemble de bibliothèques natives (dll dans notre cas).

Charger 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. Ma compréhension est qu'une fois qu'il atteint un appel loadLibrary système (c'est-à-dire que Java a trouvé la bibliothèque dans son java.library.path et dit maintenant à l'OS de la charger) - il dépend entièrement du système d'exploitation pour trouver les bibliothèques dépendantes, car à ce moment-là c'est le système d'exploitation qui charge la bibliothèque pour le processus, et le système d'exploitation sait seulement regarder dans le chemin système. Cela semble difficile à définir dans le cas d'une application Webstart, mais il y a une solution qui ne nécessite pas de compilation statique. Vous pouvez peut-être repositionner vos bibliothèques - je ne suis pas sûr

Si vous utilisez un classloader personnalisé, vous pouvez remplacer loadLibrary et findLibrary pour qu'il puisse localiser vos bibliothèques depuis un jar dans votre classpath, et si vous le faites également conscient de vos dépendances de bibliothèques natives (c'est-à-dire libB dépend de libA dépend de libX, alors lors du chargement de libB vous pouvez vous rattraper et vous assurer de charger libA en premier, et en vérifiant cela remarquez et chargez d'abord libX. Alors, l'OS ne tente pas de trouver une bibliothèque qui n'est pas dans votre chemin. C'est un peu compliqué et un peu douloureux, mais s'assurer que Java les trouve et les charge tous dans le bon ordre peut fonctionner.

5voto

basszero Points 14539

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

1voto

Adam Mitz Points 4540

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

dans le fichier JNLP ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X