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.

5voto

Rob van Riswick Points 31

Avez-vous rencontré le même problème avec une machine XP lors de l'installation de javacv et opencv en combinaison avec Eclipse. Il s'est avéré que je manquais les fichiers suivants:

  • msvcp100.dll
  • msvcr100.dll

Une fois ces fichiers installés, le projet s'est compilé et exécuté correctement.

5voto

caopeng Points 29

Veuillez vérifier si votre chemin de bibliothèque est correct ou non. Bien sûr, vous pouvez utiliser le code suivant pour vérifier votre chemin de bibliothèque : System.out.println(System.getProperty("java.library.path"));

Vous pouvez définir le java.library.path lors du lancement d'une application Java :

java -Djava.library.path=chemin ...

2voto

user2038596 Points 151
  • Réponse courte : pour l'erreur "ne peut pas trouver la bibliothèque dépendante", vérifiez votre $PATH (correspond à la puce #3 ci-dessous)
  • Réponse longue:
    1. Monde Java pur : la JVM utilise "Classpath" pour trouver les fichiers de classe
    2. Monde JNI (frontière java/native) : la JVM utilise "java.library.path" (qui correspond par défaut à $PATH) pour trouver les DLL
    3. Monde natif pur : le code natif utilise $PATH pour charger d'autres DLL

2voto

rhysl Points 33

J'ai trouvé un excellent article écrit par des amis de keepsafe qui ont rencontré le même problème que moi. Cela a fonctionné pour moi, donc j'espère que cela vous aidera aussi! Lisez-le si vous êtes intéressé (The Perils of Loading Native Libraries on Android) ou utilisez simplement

compile 'com.getkeepsafe.relinker:relinker:1.2.3'

et remplacez

System.loadLibrary("myLibrary");

par

ReLinker.loadLibrary(context, "mylibrary");

2voto

Sunil Kumar Points 11

Installer Microsoft Visual C++ 2010 SP1 Redistribuable l'a réglé

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