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.

0voto

Mohsin Raza Points 149

J'ai rencontré le même problème avec la bibliothèque ffmpeg après avoir fusionné deux projets Android en un seul projet.

En fait, le problème survenait en raison de deux versions différentes de la bibliothèque ffmpeg mais elles étaient chargées avec les mêmes noms en mémoire. Une bibliothèque était placée dans JNiLibs tandis que l'autre était à l'intérieur d'une autre bibliothèque utilisée comme module. Je n'ai pas pu modifier le code du module car il était en lecture seule, alors j'ai renommé celle utilisée dans mon propre code en ffmpegCamera et je l'ai chargée en mémoire avec le même nom.

System.loadLibrary("ffmpegCamera");

Cela a résolu le problème et maintenant les deux versions des bibliothèques se chargent séparément avec des noms différents et des identifiants de processus en mémoire.

0voto

Nitin Bisht Points 11

J'ai rencontré le même problème après avoir migré mon CI sur une nouvelle machine. Je continuais à rencontrer le même problème même après avoir appliqué toutes les solutions ci-dessus.

Le problème était que sur ma nouvelle machine, Microsoft Visual C++ 2010 SP1 Redistributable x86 était installé. Mais ma nouvelle machine avait un CPU et un système d'exploitation 64 bits. La solution a été simplement de mettre à jour et d'installer la version 64 bits à partir d' ici.

-2voto

Pratik Varpe Points 11
  1. Allez sur http://tess4j.sourceforge.net/usage.html et cliquez sur Visual C++ Redistributable for VS2012
  2. Téléchargez-le et exécutez VSU_4\vcredist_x64.exe ou VSU_4\vcredist_x84.exe selon la configuration de votre système
  3. Placez vos fichiers dll dans le dossier lib, ainsi que vos autres bibliothèques (par exemple \lib\win32-x86\vos fichiers dll).

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