J'utilise JNA et Java mais je pense que cette question affecte tout pont natif-à-natif.chemins de recherche où une bibliothèque native dépend d'une autre
J'ai une application Java qui repose sur lib1.dylib, et lib1.dylib repose sur lib2.dylib.
Je veux mettre tout à l'intérieur de mon fichier .app sur Mac. Je peux facilement mettre lib1.dylib à l'intérieur et mettre java.classpath (ou NativeLibrary.addSearchPath()) pour dire à la JVM où trouver lib1.dylib. Le problème est, je ne sais pas comment communiquer que les dépendances de lib1.dylib sont également dans l'emplacement que j'ai fourni. Le résultat est que lib1 est bien chargé, mais que lib2 ne peut pas être trouvé car il ne se trouve pas dans le chemin de la bibliothèque du système d'exploitation.
Quelqu'un sait comment je peux surmonter ce problème? J'imagine que cela doit arriver beaucoup dans les grands projets avec un grand nombre de bibliothèques partagées.
Merci! Je vérifierai. Désolé de confondre classpath et java library path dans ma question. (1) ou (2) peut valoir la perte de la portabilité. J'essaie d'éviter (3) car cela complique grandement l'installateur, nécessite un accès root, risque d'écraser les anciennes versions de libs dont d'autres applications ont besoin, etc.: - \ –
Après avoir étudié ces options, rien que de mauvaises nouvelles. (1) Ne fonctionne pas avec JNA. Apparemment, JNA ne se soucie pas de savoir si Java a déjà chargé la bibliothèque, vraisemblablement parce qu'elle doit faire ses propres tâches de cartographie. Cela fonctionnerait cependant avec JNI. (2) nécessiterait un code spécial pour différents systèmes d'exploitation, mais le plus problématique est qu'il n'y a pas d'équivalent à dllmain sous UNIX et aucune garantie spécifique (que je sache) que le commutateur cwd sera exécuté avant que la recherche de dépendances soit terminée. Je ne vois pas d'alternative à (3) que j'essayais d'éviter avec cette question. Bummer. –