Java-Programm findet DLLs nicht!

Dann07

Aktives Mitglied
Guten Tag/Abend!
Ich experimentiere seit einiger seit mit der/die/das JNI (Java Native Interface).. Keine Ahnung ob der, die oder das. 😅
Und ich hab eine DLL erstellt die auf andere DLLs also Bibliotheken zugreift.
Nun versuche ich in meinem Java-Programm meine DLL zu laden mit:

Java:
System.loadLibrary("meineDLL");

Jetzt gibt er mir aber einen Fehler:

Java:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Pfad\zu\meiner\DLL\meineDll.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)

Also er kann die anderen DLLs nicht finden.
Dabei sind die DLLs in den gleichen Ordner wie meine DLL. (Das wäre im Projekt-Ordner)
Ich hab schon alles im Internet durch geguckt. (Vielleicht nicht alles aber das was ich finden konnte. 😀)

Vielleicht kann mir ja wer helfen. Freue mich auf jede Antwort.

Paar Informationen die vielleicht helfen (hab gelesen das die Architektur wichtig ist):

Prozessor-Architektur: x64
Betriebssystem-Architektur (Windows 10 Home): 64-Bit
Meine DLL wurde kompiliert für: x64
Die DLLs (Bibliotheken) die ich verwende sind für: x64
Java,JDK ist für: x64
Java-IDE: Eclipse
C++-IDE: Visual Studio 2019 Community

Ich denke das diese Informationen (VIELLEICHT) hilfreich sind.
 
Die JVM lädt DLLs, die nicht über einen absoluten Pfad angegeben sind, wie also die Dependent Libraries deiner DLL, aus dem java.library.path.
Starte deine JVM mal mit dem `-Djava.library.path=Pfad\zu\meiner\DLL` JVM Argument. Achtung: JVM Argument und NICHT Program argument. Also vor ein eventuelles -jar Argument im Aufruf!
 
Die JVM lädt DLLs, die nicht über einen absoluten Pfad angegeben sind, wie also die Dependent Libraries deiner DLL, aus dem java.library.path.
Starte deine JVM mal mit dem `-Djava.library.path=Pfad\zu\meiner\DLL` JVM Argument. Achtung: JVM Argument und NICHT Program argument. Also vor ein eventuelles -jar Argument im Aufruf!

Danke für die Antwort aber das hab ich schon versucht. Nur hat es nicht geklappt. Trotzdem Danke nochmal!
 
Hmm... hast du die PATH Umgebungsvariable auch schon um diesen Pfad erweitert? Zum Beispiel in der lokalen cmd Session:
Code:
set PATH=%PATH%;Pfad\zu\meiner\DLL
java ...
 
Ähm... das Programm hängt sich jedes Mal auf. 😂
Aber EIGENTLICH hab ich alle DLLs zusammen die ich benötige. (Selbst die die nicht benötigt werden. 🤣)
 
Ähm... das Programm hängt sich jedes Mal auf. 😂
Lass es einfach mal ein bisschen laufen. Das Problem habe ich auch, seitdem Visual Studio ganz viel .net und Assembly-Manifest MIST in die Module reingeneriert und er tausende .net Assembly DLLs lazy als Abhängigkeit drin hat... am besten im MSVC Projekt der DLL die Runtime statisch linken und sämtliche Optionen, die nur nach "Manifest" klingen, ausschalten.
 
Und was sagt letztlich Dependency Walker? Du musst dem etwas Zeit geben. 🙂
Ist vielleicht auch eine transitive Abhängigkeit, also eine Abhängigkeit einer Abhängigkeit.
 
Ich hab mal geguckt. Die DLL benötigt: KERNEL32.DLL, VCRUNTIME140D.DLL, UCRTBASED.DLL, OLE32.DLL, KERNELBASE.DLL.
Aber die sollten doch kein Problem darstellen oder nicht?
 
VCRUNTIME140D.DLL könnte ein Problem sein. Das ist die Debug-Variante der Runtime Library.
Kannst ja mal in C:\Windows\System32\ oder so gucken, ob da alles da ist. Bezweifle ich aber. Diese DLL ist bestimmt nur in der MSVC Installation irgendwo hinterlegt und wird dynamisch dazugelinkt, wenn du ein Prozess debuggst.
Bau mal im Release-Modus und, wie gesagt, linke nicht per Multithreaded DLL, sondern per "Multithreaded", also linke die Runtime statisch.
 
Also Release-Modus kann ich versuchen aber alles andere dahinter musst du mir erklären. Ich bin nicht wirklich helle was das angeht. 😂
 
Lass dir mal mit java -XshowSettings:properties -version den shared library search path ausgeben:

Ansonsten halte dich an die Anleitung von @httpdigest was den Debug-Modus betrifft.
 
Ich hab endlich mein Problem behoben! Und das ist die Lösung:

Ich hatte DLLs genommen die nicht für meine Windows Version waren. Deshalb konnte Java die wahrscheinlich nicht laden.
Und ich muss im Java-Programm die DLLs die ich benötige laden. (Also nicht nur meine DLL).

Das sieht im Programm so aus:

Java:
System.loadLibrary("DLL1");
System.loadLibrary("DLL2");
System.loadLibrary("DLL3");
System.loadLibrary("MeineDLL");

Ich danke euch trotzdem das ihr mir geholfen habt. 😉🙂
 
Ich experimentiere seit einiger seit mit der/die/das JNI (Java Native Interface).. Keine Ahnung ob der, die oder das. 😅
Off Topic, aber da ich durchaus Gefallen an der Auseinandersetzung mit Sprachen, gerne auch der eigenen, finde...

Verkürzen wir den Satz mal auf das Wesentliche: "Ich experimentiere mit JNI." Würde schon reichen 🙂 Aber es soll ja ein Artikel rein.

"Ich experimentiere." wäre ein vollständiger Satz, bestehend aus Subjekt ("Ich") und Prädikat ("experimentiere"). Das Anhängsel "mit JNI" ist eine Ergänzung.

Aufgrund der Präposition "mit" kommen hier prinzipiell die adverbiale Ergänzung und das Präpositionalobjekt in Frage. Da hier aber kein Umstand beschrieben wird, bleibt nur das Objekt übrig. Lässt sich auch daran erkennen, dass die Frage nach JNI nicht ohne "mit" auskommt: "Womit experimentiere ich?" oder auch "Mit (wem oder) was experimentiere ich?"

Die Frage nach der adverbialen Ergänzung würde dagegen ohne die Präposition auskommen, z. B. würde beim Satz "Ich experimentiere mit größter Sorgfalt." die Frage "Wie experimentiere ich?" (ohne, dass dort "mit" vorkommen würde) gestellt werden können, die "mit größter Sorgfalt" beantwortet würde.

Kommen wir zum Artikel. Das Wort "JNI" ist keinesfalls maskulin. Gehen wir von Java Native Interface aus, wäre "Interface" ausschlaggebend. Interface ist neutral ("das Interface"). Da das Objekt im Dativ steht, lautet der korrekte Satz folglich "Ich experimentiere mit dem JNI."

Interessant ist, dass das bei Abkürzungen durchaus auch mal ein anderer Genus unterstellt wird. So wird "API" in der Regel als feminines Wort ("die API") betrachtet, obwohl es in der Langform ganz klar neutral wäre ("das Application Programming Interface"). Geht man von "die API" aus, würde der Satz "Ich experimentiere mit der API." lauten. Warum "API" als feminines Wort gesehen wird, würde mich allerdings auch mal interessieren. Das wird vermutlich einfach ein Sprachgebrauch sein, der sich durchgesetzt hat.

Anderes Beispiel hierfür wäre "BIC". Da liest man auch oft beide Varianten, also "der BIC" und "die BIC" (auch bei Banken). Da "BIC" für "Bank Identifier Code" steht, müsste es korrekt "der BIC" lauten. Manchmal liest man auch Konstrukte wie "der BIC-Code", was dann zum völligen Quatsch ausartet (wie auch bei "PIN-Nummer" oder "TAN-Nummer").
 

Zurück
Oben