web-dev-qa-db-fra.com

UnsatisfiedLinkError - Impossible de charger la bibliothèque - Bibliothèque native introuvable dans le chemin d'accès aux ressources

J'ai l'erreur suivante au moment de l'exécution, lorsque j'essaie d'exécuter Tess4J:

Exception in thread "main" Java.lang.UnsatisfiedLinkError: Unable to load library 'libtesseract302': Native library (win32-x86-64/libtesseract302.dll) not found in resource path ([myproject/target/classes/, ...some jars...])

Mes questions sont:

1) Qu'est-ce qu'il cherche exactement à trouver et où?

2) Pourquoi recherche-t-il apparemment le répertoire myproject/target/classes/? Je l'ai mis nulle part.

3) Pourquoi ignore-t-il le "chemin de répertoire natif" que j'ai défini pour tess4j.jar dans la description de la bibliothèque utilisateur dans Eclipse? Mes DLL sont là. S'il n'ignorait pas le chemin, il trouverait des DLL.

4) Pourquoi le nom DLL avec win32-x86-64/ apparaît-il apparemment en avance? Je pose ceci nulle part. Est-ce que ce préfixe standard de certaines API?

5) Qu'est-ce qu'un "chemin de ressource"? Comment le régler?

8
Suzan Cioc

Comme le dit l'erreur, il recherche win32-x86-64/libtesseract302.dll dans Java.class.path. Une partie de votre chemin de classe inclut apparemment myproject/target/classes.

Le préfixe représente la plate-forme et l'architecture de la bibliothèque partagée à charger, ce qui permet aux bibliothèques partagées de différentes cibles d'être incluses dans la même archive. Si la JNA ne trouve pas le nom de la bibliothèque demandée dans le chemin de chargement du système, elle tente de le trouver dans votre chemin de ressources (en l'extrayant si nécessaire). Donc, si vous mettez la DLL dans un fichier JAR, vous devrez lui donner le préfixe win32-x86-64 pour pouvoir la charger.

Le "chemin de ressource" est nominalement votre chemin de classe; pratiquement n'importe où accessible par ClassLoader.getResource().

5
technomage

L'erreur provient de votre tentative de chargement de DLL 32 bits dans une machine virtuelle Java 64 bits. La solution possible est de passer à la JVM 32 bits. Vous pouvez également utiliser les DLL Tesseract et Leptonica 64 bits .

3
nguyenq

Pourquoi n'utilisez-vous pas l'API JNA http://www.Java2s.com/Code/Jar/j/Downloadjna351jar.htm pour charger la bibliothèque native? Une fois que vous avez mis dans votre classpath du projet, vous ajoutez ce code

NativeLibrary.addSearchPath("libtesseract302", "your native lib path"); assurez-vous que vous avez ce fichier libtesseract302.dll, normalement, il se trouve dans le dossier windows32.

Par exemple, si votre fichier libtesseract302.dll se trouve quelque part dans c:/abcv/aaa/libtesseract302.dll, il vous suffit de définir le chemin d'accès comme ceci: NativeLibrary.addSearchPath("libtesseract302", "c:/abcv/aaa");

Je ne sais pas comment le chemin Windows ressemble à c:/abcv/aaa ou c:\\abcv\\aaa\\

si vous voulez un moyen plus simple, il suffit de mettre tout votre fichier dll nécessaire dans votre dossier Windows32, JVM s'en occupera.

Un autre problème peut être que vous n'avez pas installé l'application correctement ou que la version de l'application ne correspond pas à la version de votre fichier jar. essayez d’installer la dernière application et de télécharger le dernier fichier jar pour réessayer. J'espère que ça aide :)

2
taymedee

Avait le même problème, trié avec les lignes suivantes

System.load ("/ usr/local/lib/liblept.so.5")

System.loadLibrary ("tesseract")

Dans votre cas, il peut s'agir de bibliothèques différentes, mais au final, c'est à peu près la même chose: chargez simplement les bibliothèques dont vous avez besoin manuellement.

2
Painy James

Il y a quelques jours, j'ai rencontré le même message d'erreur lorsque je tentais de charger un fichier C++ DLL avec JNA. Il s'est avéré que la cause était un DLL manquant et sur lequel mon DLL dépendait.

Dans mon cas, c’était le MS Visual Studio 2012 redistribuable, que j’ai ensuite téléchargé et installé sur la machine et le problème a disparu. Essayez d’utiliser Dependency Walker pour rechercher les bibliothèques manquantes et les installer.

0
ohgodnotanotherone

J'ai eu le même problème et j'ai constaté que ce "chemin d'accès aux ressources" n'était pas défini par "chemin d'accès au répertoire natif".
Vous pouvez cependant y ajouter de nouveaux dossiers en utilisant "Ajouter un dossier de classe externe" dans l'onglet Bibliothèque, même si ce dossier ne contient aucun fichier de classe mais des fichiers de bibliothèque natifs (comme DLL sur Les fenêtres)

0
user2759511