101 votes

Comment corriger une UnsatisfiedLinkError (Impossible de trouver les bibliothèques dépendantes) dans un projet JNI

Je travaille sur un projet Java qui utilise le JNI. Le JNI appelle une bibliothèque personnalisée que j'ai écrite moi-même, disons mylib.dll, et qui dépend d'une bibliothèque tierce, libsndfile-1.dll.

Lorsque je lance mon programme, il plante avec

java.lang.UnsatisfiedLinkError:  C:\...chemin...\mylib.dll: Impossible de trouver les bibliothèques dépendantes.

J'ai cherché sur ce site (et d'autres) et j'ai essayé un certain nombre de solutions :

  1. J'ai exécuté Dependency Walker. DW a donné quelques avertissements -- que deux bibliothèques requises par libsndfile, MPR.DLL et SHLWAPI.DLL, avaient des "imports non résolus" -- mais la FAQ de DW disait que ces avertissements pouvaient être ignorés en toute sécurité.

  2. J'ai corrigé les noms de méthode dans mylib.dll, comme suggéré ici. Les noms de méthode avaient été malmenés par le compilateur, mais j'ai ajouté des drapeaux de liaison et les noms de méthode du dll correspondent maintenant exactement à ceux de mon fichier d'en-tête jni.

  3. J'ai mis tous ces DLL dans le même répertoire -- le même répertoire que le .jar qui les appelle -- pour m'assurer qu'ils sont sur le bon CHEMIN.

Ça ne marche pas.

Est-ce que quelqu'un a une idée de ce qui se passe ?

Je développe dans Visual Studio 2010 sur un MacBook pro (via Parallels). Je fais mes tests sous Windows XP sur un ordinateur portable toshiba.

1voto

Steven Peng Points 21

J'avais exactement le même problème, et finalement il a été résolu.

J'ai mis toutes les DLL dépendantes dans le même dossier où se trouvait mylib.dll et je me suis assuré que le compilateur JAVA pouvait le trouver (s'il n'y a pas de mylib.dll dans le chemin de compilation, une erreur sera signalée lors de la compilation). La chose importante à noter est que vous devez vous assurer que toutes les bibliothèges dépendantes sont de la même version que mylib.dll, par exemple si votre mylib.dll est en version de production, vous devez également mettre la version de production de toutes ses bibliothèques dépendantes.

J'espère que cela pourra aider les autres qui ont rencontré le même problème.

1voto

estebanuri Points 94

J'avais le même problème, et j'ai essayé tout ce qui est posté ici pour le résoudre mais rien n'a fonctionné pour moi. Dans mon cas, j'utilise Cygwin pour compiler le dll. Il semble que la JVM essaie de trouver les DLL JRE dans le chemin virtuel de Cygwin. J'ai ajouté le chemin du répertoire virtuel de Cygwin aux DLL JRE et ça fonctionne maintenant. J'ai fait quelque chose comme:

SET PATH="/cygdrive/c/Program Files/Java/jdk1.8.0_45";%PATH%

1voto

bwfrieds Points 311

Dans ma situation, j'essayais de lancer un service web Java dans Tomcat 7 via un connecteur dans Eclipse. L'application fonctionnait bien lorsque je déployais le fichier war sur une instance de Tomcat 7 sur mon ordinateur portable. L'application nécessite un driver de type 2 jdbc pour "IBM DB2 9.5". Pour une raison étrange, le connecteur dans Eclispe ne pouvait pas voir ou utiliser les chemins dans les variables d'environnement IBM DB2, pour atteindre les fichiers dll installés sur mon ordinateur portable en tant que client jcc. Le message d'erreur indiquait soit qu'il n'arrivait pas à trouver le fichier dll db2jcct2, soit qu'il n'arrivait pas à trouver les bibliothèques dépendantes de ce fichier dll. Finalement, j'ai supprimé le connecteur et reconstruit. Ensuite, cela a fonctionné correctement. J'ajoute cette solution ici en tant que documentation, car je n'ai pas réussi à trouver cette solution spécifique ailleurs.

0voto

Caesar Points 480

La création d'une bibliothèque statique a fonctionné pour moi, en la compilant avec g++ -static. Cela regroupe les bibliothèques dépendantes avec la construction.

0voto

user3122472 Points 11

Placez les dll requises dans le dossier et définissez le chemin du dossier dans la variable d'environnement PATH. Assurez-vous que la variable d'environnement PATH mise à jour est prise en compte.

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