Wie behebt man einen UnatisfiedLinkError (Kann keine abhängigen Bibliotheken finden) in einem JNI-Projekt
Arbeite ich an einem Java-Projekt, das mit der JNI. Die JNI-Aufrufe einer eigenen Bibliothek, die ich geschrieben habe, mich, sagen wir mal mylib.dll und das hängt von einem 3rd-party-Bibliothek, libsndfile-1.dll.
Wenn ich mein Programm stürzt ab, mit
java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries.
Ich gesucht habe diese Seite (und andere), und ich habe versucht, eine Reihe von fixes:
- Ich lief dependency walker. DW gab ein paar Warnungen -- , zwei Bibliotheken benötigt, die von libsndfile, MPR.DLL und SHLWAPI.DLL hatte "ungelöste Importe" - aber die DW-FAQ gesagt, dass diese Warnungen könnten, ignoriert werden.
- Ich der festen Methodennamen mylib.dll wie vorgeschlagen hier. Die Methode, die Namen hatten, irgendwie bekommen entstellt durch den compiler, aber ich habe linker flags, und die dll-Methode-Namen entsprechen nun denen in meiner jni-header-Datei genau.
- Habe ich alle diese DLLs in das selbe Verzeichnis -- das gleiche Verzeichnis wie die .jar, ruft Sie --, um sicherzustellen, dass Sie auf dem richtigen WEG sind.
Kein Würfel.
Hat jemand eine Idee was Los ist???
Mache ich meine Entwicklung in Visual Studio 2010 auf einem MacBook pro (über Parallels). Ich mache meine Prüfung in Windows XP auf einem toshiba-laptop.
InformationsquelleAutor der Frage dB' | 2011-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir ziemlich sicher, dass der Klassenpfad und die shared-library search path " haben wenig miteinander zu tun. Nach Die JNI-Buch (die zwar alt ist), auf Windows, wenn Sie nicht die
java.library.path
system-Eigenschaft, die DLL muss sich im aktuellen Arbeitsverzeichnis oder in einem Verzeichnis aufgeführt, die in der Windows -PATH
Umgebungsvariable.Update:
Aussieht hat Oracle entfernt die PDF-Datei von seiner website. Ich habe aktualisiert, der link oben, um auf eine Instanz der PDF-living an der Universität von Texas - Arlington.
Können, können Sie auch Lesen Sie auch die Oracle-HTML-version der JNI-Spezifikation. Das Leben in der Java-8-Abschnitt der Java-website und so hoffentlich für eine Weile herum.
Update 2:
Zumindest in Java 8 (habe ich nicht geprüft früheren Versionen), die Sie tun können:
finden Sie die shared-library-search-path. Suchen Sie nach den Wert der
java.library.path
- Eigenschaft in der Ausgabe.InformationsquelleAutor der Antwort QuantumMechanic
Will ich informieren diese interessante Fall, nach der versucht, alle der oben genannten Methode, der Fehler ist immer noch da. Das seltsame ist, es funktioniert auf einem computer mit Windows 7, aber auf Windows XP ist es nicht. Dann verwende ich dependency walker und fand auf der Windows XP-es ist keine VC++ Runtime als mein dll-Anforderung. Nach der Installation von VC++ Runtime-Paket hier es funktioniert wie ein Charme. Die Sache, die mich störten, ist es immer wieder sagt, Kann nicht finden abhängigen Bibliotheken, während intuitiv der JNI-abhängige dll ist da, aber es schließlich stellt sich heraus, das JNI-abhängige dll erfordert eine weitere abhängige dl. Ich hoffe, das hilft.
InformationsquelleAutor der Antwort longbkit
Müssen Sie laden Sie Ihre JNI-Bibliothek.
System.loadLibrary lädt die DLL aus dem Pfad für JVM (JDK-bin-Pfad).
Wenn Sie möchten, laden Sie eine explizite Datei mit einem Pfad, verwenden Sie System.laden()
Siehe auch: Unterschied zwischen System.load() und System.loadLibrary in Java
InformationsquelleAutor der Antwort Yochai Timmer
Bitte überprüfen Sie Ihre Bibliothek-Pfad richtig ist oder nicht. Natürlich können Sie verwenden Sie folgenden code, um zu überprüfen, Ihre Bibliothek Pfad:
System.out.println(System.getProperty("java.library.path"));
Können Sie bestellen die java.Bibliothek.Pfad beim starten einer Java-Anwendung:
InformationsquelleAutor der Antwort caopeng
Habe identisches problem mit XP-Rechner bei der Installation
javacv
undopencv
in Kombination mit Eclipse. Es stellte sich heraus, dass ich fehlte die folgenden Dateien:Sobald diese installiert wurden, wird das Projekt kompiliert und lief OK.
InformationsquelleAutor der Antwort Rob van Riswick
Laden Sie ein 32-bit-version der dll mit einem 64-bit-JRE könnten Sie dieses Problem haben. Dies war mein Fall.
InformationsquelleAutor der Antwort EFalco
Früher habe ich genau das gleiche problem, und schließlich wurde es gelöst.
Ich habe alle abhängigen DLLs in den selben Ordner, wo mylib.dll wurde gespeichert, und stellen Sie sicher, dass der JAVA-Compiler finden konnte (wenn es keine mylib.dll in der Zusammenstellung Weg, wäre es eine Fehler Meldung beim kompilieren). Die wichtigste Sache, die Sie brauchen, um zu bemerken ist, müssen Sie sicherstellen, dass alle abhängigen libs sind von der gleichen version mit mylib.dll für Beispiel, wenn Ihr mylib.dll ist der release-version dann sollten Sie auch die release-version werden alle seine abhängigen libs gibt.
Hoffe, dass dies anderen helfen kann, die hatte das gleiche problem.
InformationsquelleAutor der Antwort Steven Peng
Ich hatte das gleiche Problem, und ich habe alles versucht was hier gepostet, um es zu beheben, aber keiner war für mich.
In meinem Fall bin ich mit Cygwin zu kompilieren Sie die dll. Es scheint, dass die JVM versucht, zu finden die JRE-DLLs in den virtuellen Cygwin-Pfad.
Ich fügte hinzu, das das Cygwin-Verzeichnis Pfad zum JRE ' s DLLs und es funktioniert jetzt.
Ich habe so etwas wie:
InformationsquelleAutor der Antwort estebanuri
In meiner situation, ich habe versucht, führen Sie eine java-Webservice in Tomcat 7 über einen connector in Eclipse. Die app lief gut, wenn ich der Bereitstellung der war-Datei in eine Instanz des Tomcat 7 auf meinem laptop. Die app erfordert eine jdbc type 2-Treiber für "IBM DB2 9.5". Für einige ungerade Grund den Stecker in Eclispe nicht sehen konnte, oder verwenden Sie die Pfade, die in der IBM DB2-Umgebungsvariablen, zu erreichen, um die dll-Dateien installiert, auf meinem laptop, als die GBA-client. Die Fehlermeldung besagte, dass es nicht die db2jcct2 dll-Datei sein, oder es konnte die abhängigen Bibliotheken für diese dll-Datei. Letztendlich habe ich gelöscht, den Stecker und umgebaut. Dann funktionierte es einwandfrei. Ich bin das hinzufügen dieser Lösung hier als Dokumentation, weil ich konnte nicht finden, diese spezifische Lösung irgendwo sonst.
InformationsquelleAutor der Antwort bwfrieds
InformationsquelleAutor der Antwort user2038596
Fand ich einen Artikel von einigen Freunden auf keepsafe, die gingen durch die gleiche Sache, die ich Tat. Bei mir hat es geklappt, hoffentlich hilft es Euch genauso gut! Haben, Lesen Sie, wenn Sie interessiert sind (Die Tücken der Laden von Nativen Bibliotheken auf Android) oder nutzen Sie einfach
compile 'com.getkeepsafe.relinker:relinker:1.2.3'
und ersetzen
mit
InformationsquelleAutor der Antwort rhysl
Visual C++ Redistributable for VS2012
VSU_4\vcredist_x64.exe
oderVSU_4\vcredist_x84.exe
je nach Konfiguration Ihres Systemsdll
Dateien imlib
Ordner, zusammen mit Ihren anderen Bibliotheken (z.B.\lib\win32-x86\your dll files
).InformationsquelleAutor der Antwort Pratik Varpe