Java-Programm findet DLLs nicht!

Diskutiere Java-Programm findet DLLs nicht! im Allgemeine Java-Themen Bereich.
Dann07

Dann07

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. :D)

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.
 
H

httpdigest

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!
 
Dann07

Dann07

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!
 
H

httpdigest

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 ...
 
H

httpdigest

Dann sind nicht wirklich alle nötigen DLLs in dem Ordner. Hast du mal mit Dependency Walker in die DLL geschaut, welche abhÀngigen DLLs denn benötigt werden?
 
Dann07

Dann07

Ä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. đŸ€Ł)
 
H

httpdigest

Ä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.
 
Dann07

Dann07

Probier ich aus. Ich melde mich wieder wenn ich es gemacht hab. 👍
 
Dann07

Dann07

Gleicher Fehler wie vorher. Alles was mit Manifest zu tuhen hatte hab ich deaktiviert.
 
H

httpdigest

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.
 
Dann07

Dann07

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?
 
H

httpdigest

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.
 
Dann07

Dann07

Also Release-Modus kann ich versuchen aber alles andere dahinter musst du mir erklĂ€ren. Ich bin nicht wirklich helle was das angeht. 😂
 
B

BestGoalkeeper

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.
 
Dann07

Dann07

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. ;):)
 
Thema: 

Java-Programm findet DLLs nicht!

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben