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.
J'ai eu exactement le même problème avec le chargement d'une DLL, je l'ai résolu de cette façon:
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.
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
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.
Trois raisons possibles à ce problème, si le fichier dll n'est pas cassé:
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.
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.
la dll que nous chargeons nécessite d'autres dll.
Comment gérer la 3ème possibilité:
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.
En chargeant ces DLL avant la DLL que nous voulons charger, nous pouvons résoudre ce problème.
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)