web-dev-qa-db-fra.com

Essayer d'utiliser DLL from Java (JNA). Impossible de charger l'exception de bibliothèque

J'ai un projet NetBeans de tutoriel qui provoque une exception:

Exception dans le thread "principal" Java.lang.UnsatisfiedLinkError: Unable to load library 'simpleDLL': le module spécifié est introuvable.

J'ai essayé de mettre simpleDLL.dll dans les bibliothèques de projet, le fichier copié dans le dossier system32 sans succès.

12
Karloss

J'ai eu exactement le même problème avec le chargement d'une DLL, je l'ai résolu de cette façon:

  • Comme l'a dit Christian Kuetbach, vérifiez si le simpleDLL que vous utilisez est compatible avec l'architecture de votre processeur, un 32 bits DLL ne fonctionnera pas sur une machine 64 bits, et également un 64 bits DLL ne fonctionnera pas sur une machine 32 bits.
  • Si le DLL est compatible, alors le problème peut être dans votre Java chemin de bibliothèque. Je mets mon DLL dans le user.dir répertoire puis j'ai utilisé ce code:

    Définissez Java chemin de la bibliothèque sur user.dir ou peut-être un autre chemin que vous souhaitez:

    String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path
    
    System.setProperty("Java.library.path", myLibraryPath);
    

    Chargez la bibliothèque:

    System.loadLibrary ("libraryWithoutDLLExtension");

Cela a fonctionné pour moi, essayez-le et dites-moi si cela fonctionne pour vous.

12
BackSlash

Veuillez vérifier si le simpleDLL est 32 ou 64 bits. Vérifiez ensuite si la JVM est également 32 ou 64 bits. Ils doivent être pour la même plate-forme.

Vous pouvez également spécifier un chemin absolu, si vous changez loadLibrary() en load(): http://www.chilkatsoft.com/p/p_499.asp

5
Christian Kuetbach

Je ne pouvais fonctionner qu'en 32 bits (Xp).

Placez le DLL dans le dossier "c:\Windows\System32"

helloWorldDLL lib = (helloWorldDLL) Native.loadLibrary ("helloworldDLL", helloWorldDLL.class);

Si l'erreur Java.lang.UnsatisfiedLinkError: Impossible de charger la bibliothèque "persiste, utilisez Dependency Walker pour afficher les DLL dépendantes.

Marcheur de dépendances

2
Maurício

Trois raisons possibles à ce problème, si le fichier dll n'est pas cassé:

  1. Compatibilité 32 bits 64 bits. La DLL 32 bits ne peut fonctionner que sur un jdk ou jre 32 bits. En utilisant la commande Cygwin file <filename>, Nous pouvons dire si une DLL est 32 bits ou 64 bits.

  2. la dll n'est pas située dans le bon chemin, donc Java ne peut pas le localiser. De manière générale, nous pouvons utiliser un chemin absolu autre que System32 pour nous assurer que le chemin est correct.

  3. la dll que nous chargeons nécessite d'autres dll.

Comment gérer la 3ème possibilité:

  1. l'utilisation de System.loadLibrary() mthod de JNI peut me donner plus d'indices, comparé à JNA. Il peut indiquer quelque chose comme: Exception in thread "main" Java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries. Cela signifie que certaines bibliothèques MyLibrary.dll Dépendent sont manquantes. En utilisant marcheur de dépendances nous pouvons dire quelles DLL sont nécessaires.

  2. En chargeant ces DLL avant la DLL que nous voulons charger, nous pouvons résoudre ce problème.

1
ZhaoGang

Eu le même problème et pour une raison quelconque, même si le nom du fichier dll a des lettres majuscules, vous devez le charger en utilisant toutes les lettres minuscules comme ceci: Native.loadLibrary("dlls/library.dll", YourInterface.class)

PAS ceci: Native.loadLibrary("dlls/Library.dll", YourInterface.class)

0