J'essaye de charger une dll en Java en utilisant le code suivant System.loadLibrary ("mydll");
Le projet est placé dans D:\development\project\et j’ai placé la DLL sur D :. J'ai ensuite donné l'argument suivant VM dans la configuration Eclipse -Djava.library.path = D: /
Mais quand je cours je reçois UnsatisifiedLinkerError . Après avoir googlé un peu, j’ai utilisé System.load ("D:\mydll.dll");
mais encore une fois, avoir le même problème, quelqu'un pourrait-il aider?
Si vous spécifiez le DLL nom_fichier dans le chemin de la bibliothèque, omettez-le. De plus, votre appel System.loadLibrary doit simplement être "mydll". Je peux vous dire (par expérience) que si vous mettez le DLL à la racine de votre projet dans Eclipse (c.-à-d. D:\Eclipse Workspace\Proj), il devrait. Toute erreur supplémentaire liée à l'éditeur de liens peut provenir de problèmes de dépendance liés à la recherche d'autres DLL. L'exception est la même. Utilisez quelque chose comme Dependency Walker ( http://www.dependencywalker.com/ ) pour voir si votre DLL s'appuie sur autre chose que le chemin d'accès à la bibliothèque système.
Edit: UnsatisfiedLinkError : Émis si la machine virtuelle Java ne peut pas trouver une définition appropriée en langage natif d'une méthode déclarée native - il semble que vous utilisiez une fonction JNI qui n'existe pas.
Découvrez comment configurer correctement les dépendances natives ici . De plus, assurez-vous d'utiliser la machine virtuelle Java correcte: dans mon cas, la DLL n'a pas été trouvée car il s'agissait d'une DLL 32 bits, mais j'ai utilisé la machine virtuelle x64!
Un problème que vous avez est: System.load ("D:\mydll.dll"); Devrait être System.load ("D: \\ mydll.dll" ) ou System.load ("D: /mydll.dll");
J'ai eu plus de succès avec System.load, mais loadlibrary est mieux conçu pour la multiplateforme. Il calcule l'extension pour vous.
Utiliser System.loadLibrary("mydll")
fonctionne bien, vous pouvez aussi utiliser celui-là. Si vous avez utilisé javah
et que vous pensez qu'avec votre DLL tout va bien, il existe deux possibilités:
.
et placer votre DLL dans le répertoire de travail actuel. La machine virtuelle Java ne trouve pas de DLL votre DLL dépend de : Si vous avez des bibliothèques dépendantes dans votre DLL, elles sontPASsont recherchées par la machine virtuelle Java, mais par Windows lui-même. Et Windows ne connaissant pas le Java.library.path
, il recherchera dans la variable système PATH
. Si vous en avez la possibilité, vous pouvez définir la variable système PATH
sur l'emplacement de vos DLL avant de démarrer la machine virtuelle Java et tout ira bien. Ou vous pouvez charger toutes vos DLL en utilisant la JVM comme ceci
System.loadLibrary ("dll_1");
System.loadLibrary ("dll_2");
System.loadLibrary ("dll_3");
où dll_3.dll
dépend de dll_2.dll
, qui dépend de dll_1.dll
.
J'espère que cela pourra aider.
Mettez votre Almafa.dll dans le répertoire C:/Java/jre7/lib ou/bin désolé, je ne me souviens pas exactement. Une fois que vous n’avez plus fait de configuration, dites simplement
static{
System.LoadLibrary("Almafa");
}
dans la classe, où vous voulez le charger. Il ne fonctionne que dans le projet Java, dans Android comme projet, vous devez utiliser JNI. J'avais posté maintenant le résultat de 3 jours sans dormir :)
System.loadLibrarycharge le DLL à partir du chemin de la JVM (chemin bin JDK).
Si vous voulez charger un fichier explicite avec un chemin, utilisezSystem.load()
Voir aussi: Différence entre System.load () et System.loadLibrary en Java
public class MyClass
{
static
{
System.load("MyJNI.dll");
}
}
@ alee- Vous pouvez simplement copier et coller les fichiers dll dans le dossier system32 de vos fenêtres et essayer d'appeler la bibliothèque via la System.loadLibrary ("mydll") ... Je suppose que cela peut fonctionner ...
Indiquer le chemin de la bibliothèque dans votre projet comme emplacement de la bibliothèque native, semble avoir été résolu.
J'ai résolu mon erreur en utilisant les éléments suivants:
static {
try {
System.loadLibrary("myDLL");
} catch (Exception e) {
e.printStackTrace();
}
}
Au lieu d'utiliser System.load("myDLL.dll")