Frage

Ich habe einige JNI -Hooks in eine C ++ - Bibliothek geschrieben und einige DLL -Dateien für mein Java -Serverprojekt erstellt. Nehmen wir an, die DLL- und JAR -Dateien befinden sich im selben Ordner unter "C:/Server".

Ich greife mit diesen DLL -Dateien zu, indem ich:

System.loadLibrary("someDLLFile");

in der Klasse, die den C ++ - Code benötigt.

Das Problem, auf das ich renne, ist, wenn ich diesen Server auf meinem eigenen Computer ausführe. Alles funktioniert gut, unabhängig davon, wo ich den Ordner "Server" platziere. Aber wenn ich es einem Kollegen zum Testen gebe, bekommen sie ständig:

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

Ich möchte, dass die DLL -Dateien im selben Ordner wie die JAR -Dateien leben und es vorziehen, wenn jemand ihre Pfadvariable nicht konfigurieren lässt.

Warum funktioniert System.loadlibrary () auf meiner eigenen Maschine unabhängig vom Standort des Ordners, jedoch nicht auf einem anderen Computer?

War es hilfreich?

Lösung

Es funktioniert, weil die DLL (oder eine DLL, von der es abhängt, dh msvcr90.dll oder so) auf dem Weg auf Ihrer Maschine, jedoch nicht auf dem anderen.

Stellen Sie entweder Pfad env-var oder die Eigenschaft java.library.path fest, um die DIR mit Ihrer Datei zu enthalten, oder speichern Sie Ihre DLL, in der Java standardmäßig findet (viele Optionen hier, abhängig von der Bereitstellungsstrategie und -plattform).

Andere Tipps

Eine Option besteht darin, das Verzeichnis in der Befehlszeile anzugeben, wenn Sie die VM starten:

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

Eine andere Option ist die Verwendung System.load Anstatt von System.loadLibrary.

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

Der Nachteil ist, dass Ihr Programm jetzt mit plattformabhängigen Verzeichnisnamen, Dateierweiterungen usw. zu tun hat.

Ich bin mir nicht sicher, ob dies hilfreich ist oder nicht, aber ich habe Folgendes in einige Projekte aufgenommen:

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

Native Bibliotheken laden.

Und dann lade ich einfach das Bin -Verzeichnis

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

   addDir( binPath );

Es funktioniert ziemlich gut.

Aber ich bin mir nicht sicher, ob dies der Fall ist oder nicht.

Versuchen Sie es mit dem Herunterladen von Devile.exe, um festzustellen, ob die DLL von anderen DLLs des Systems abhängt oder nicht. Wenn dies der Fall ist, überprüfen Sie die andere Maschine, ob solche DLLs vorhanden sind oder nicht auf dem Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top