Question

J'ai écrit des points d'ancrage JNI dans une bibliothèque C ++ et créé des fichiers DLL pour mon projet de serveur java. Disons que les fichiers DLL et jar se trouvent dans le même dossier sous "C: / server"

.

J'accède à ces fichiers DLL à l'aide de:

System.loadLibrary("someDLLFile");

dans la classe qui a besoin du code C ++.

Le problème que je rencontre est que lorsque je lance ce serveur sur ma propre machine, tout fonctionne correctement quel que soit le lieu où je place le "serveur". dossier. Mais lorsque je le donne à un collègue pour qu'il le teste, il reçoit continuellement:

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

Je souhaite que les fichiers DLL résident dans le même dossier que les fichiers jar et je préférerais que personne ne configure leur variable PATH.

Pourquoi System.loadLibrary () fonctionne-t-il sur mon propre ordinateur, quel que soit l'emplacement du dossier, mais pas sur un autre ordinateur?

Était-ce utile?

La solution

Cela fonctionne car la DLL (ou une DLL dont elle dépend, par exemple, msvcr90.dll ou quelque chose du genre) se trouve dans le CHEMIN de votre ordinateur, mais pas sur l’autre.

Définissez PATH env-var ou la propriété java.library.path pour contenir le répertoire avec votre fichier, ou stockez votre dll où java le trouve par défaut (de nombreuses options ici, en fonction de la stratégie de déploiement et de la plate-forme).

Autres conseils

Une option consiste à spécifier le répertoire dans la ligne de commande lorsque vous démarrez la VM:

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

Une autre option consiste à utiliser System.load au lieu de System.loadLibrary .

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

L’inconvénient est que votre programme traite maintenant les noms de répertoire, les extensions de fichier, etc. dépendants de la plate-forme.

Je ne suis pas sûr que cela soit utile ou non, mais j'ai inclus les éléments suivants dans certains projets:

http://forums.sun.com/thread.jspa?threadID=707176

Pour charger des bibliothèques natives.

Et puis je charge juste le répertoire bin

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

Cela fonctionne plutôt bien.

Mais encore une fois, je ne suis pas sûr que ce soit le cas ou non.

Essayez de télécharger depend.exe pour voir si la dll dépend d’autres dll du système. Si tel est le cas, vérifiez sur l’autre ordinateur si de telles dll sont présentes ou non dans Path.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top