Classpath DLLs mittels System.load() laden:

Ulathar

Aktives Mitglied
Hallo,

ich spring hier bald im Dreieck. Ich habe ein Problem mit meinem Programm zur Laufzeit dlls zu laden.

Konkret geht es um JOGL. Ich bestimme zur Laufzeit auf welcher Plattform mein Programm ausgeführt wird (Windows, Mac oder Linux) und anschließend die Architektur (x86 oder amd64).
Basierend auf diesem "Wissen" soll mein Programm die entsprechenden Libs laden.

Soweit die Theorie.
In der Praxis bekomme ich aber einfach nicht die dlls, sos, etc geladen.

Beispielcode:

Java:
if(Settings.OS_NAME.toLowerCase().contains("windows")) {
			if(Settings.OS_ARCH.equals("amd64")) {
				try {					
					System.load(Settings.LIB_PATH + "win_x64\\jogl.dll");
					System.load(Settings.LIB_PATH + "win_x64\\jogl_awt.dll");
					System.load(Settings.LIB_PATH + "win_x64\\gluegen-rt.dll");
					System.load(Settings.LIB_PATH + "win_x64\\jogl_cg.dll");
					
					System.out.println("Success! ");
				}catch(Exception e) {
					System.out.println("Failed! ");
					e.printStackTrace(System.err);
				}
				
			}else {
//
}


        SwingUtilities.invokeLater(new Runnable() {
        	public void run() {
        		gui = new MainFrame(console);
        		gui.setVisible(true);
        	}               
        });


Analog dazu gehe ich bei allen anderen Möglichkeiten vor.
Ich sehe da einfach nicht den Fehler, aber es funktioniert einfach nicht. Die jeweiligen libs sind auch garantiert vorhanden und werden auch gefunden.
Aber im oberen Beispiel meckert der ClassLoader immer, dass die die gluegen nicht die notwendigen dependencies findet.
Ganz egal in welcher Reihenfolge ich die Libs lade.
Lasse ich die lib weg, knallt es (logischerweise) sobald ich meine JOGL Szene starte mit einer unsatisfied linker exception (could not find dll).

Wenn ich das Programm aus Eclipse heraus starte, funktioniert es einwandfrei, da ich in Eclipse die Libpfade im Projekt entsprechend gesetzt habe, nur leider wird mein "clientel" das programm NICHT aus Eclipse heraus starten ;).

Ich versteh einfach nicht warum das nicht klappen will.
Habe auch schon versucht bei meinem Launcher (mittels launch4j generiert) den lib path zu setzen, mittels:
"-Djava.library.path="./lib/win_x64""

das funktioniert dann auch, aber NUR wenn ich das programm in einer 64bit vm unter windows ausführe. sobald ich z.b. das hier mache:
-Djava.library.path="./lib/win_x64;./lib/win_x86"

und das programm in einer x86 umgebung starten will, meckert er, da er unter x86 keine 64bit dlls laden kann (logisch).


bin für jede Anregung dankbar... so schwer kann das doch echt nicht sein -.-.
 

Ariol

Top Contributor
Versuch doch mal (ungetestet)
Java:
if(Settings.OS_ARCH.equals("amd64")) {
    try {                   
        System.setProperty("java.library.path", "./lib/win_x64");
        System.load(Settings.LIB_PATH + "win_x64\\jogl.dll");
        System.load(Settings.LIB_PATH + "win_x64\\jogl_awt.dll");
        System.load(Settings.LIB_PATH + "win_x64\\gluegen-rt.dll");
        System.load(Settings.LIB_PATH + "win_x64\\jogl_cg.dll");
        System.out.println("Success! ");
    } catch(Exception e) {
        System.out.println("Failed! ");
        e.printStackTrace(System.err);
    }
}

EDIT: Propertyname war falsch
 

Ulathar

Aktives Mitglied
ändert leider nix:

java.lang.UnsatisfiedLinkError: E:\Coding\lib\win_x64\gluegen-rt.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1003)
at main.Main.main(Main.java:256)

und kann man den lib und classpath einer VM nicht nur zur startzeit setzen? also per commandozeile? meine da war was, dass das nicht zur laufzeit geht...

Edit:

hab auch schon versucht nach jedem System.load ein Thread.sleep(5000); zu machen da ich vermutet hatte, dass die vm etwas zeit braucht bis die dll vollständig geladen ist, aber dem scheint nicht so zu sein (erbrachte keine änderung).
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Ok, es fehlt wohl noch was:

Java:
if(Settings.OS_ARCH.equals("amd64")) {
    try {                   
        changeLibraryPath("./lib/win_x64");
        System.load(Settings.LIB_PATH + "win_x64\\jogl.dll");
        System.load(Settings.LIB_PATH + "win_x64\\jogl_awt.dll");
        System.load(Settings.LIB_PATH + "win_x64\\gluegen-rt.dll");
        System.load(Settings.LIB_PATH + "win_x64\\jogl_cg.dll");
        System.out.println("Success! ");
    } catch(Exception e) {
        System.out.println("Failed! ");
        e.printStackTrace(System.err);
    }
}


Java:
void changeLibraryPath(String libraryPath)
{
        System.setProperty("java.library.path",libraryPath);
        Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
        fieldSysPath.setAccessible( true );
        fieldSysPath.set( null, null );
}

Quelle mit Erklärung:
Setting “java.library.path” programmatically | Just Java
 

Ulathar

Aktives Mitglied
wenns an der MSVCR80.dll liegen würde, dürfte es auch aus Eclipse heraus nicht funktionieren.

ich mein gut, das problem ist jetzt nicht lebenswichtig, kann natürlich auch einfach diverse versionen für die jeweiligen OS releasen, aber ich fänds "schöner" wenns so ginge wie ichs mir vorstelle ;).


Edit:

@Ariol:

hmm interessanter Ansatz, scheint zu funktionieren. Ich benötige mit dem Ansatz nicht einmal mehr die System.loads...
Aber das erklärt immer noch nicht, wieso die System.loads nicht funktionieren. Ich habe generell beim Laden von DLLs (nicht nur JOGL) exakt dieses Problem, sobald ich von dem Standartprozedere abweiche. Also die DLLs nicht mehr "neben dem JAR" liegen bzw sobald ich versuche libs manuell zu laden.
Das kann ja auch irgendwo nicht richtig sein, da es in so ca jedem Tutorial (auch in den offiziellen Sun/Oracle docs) so beschrieben steht...
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Das problem ist nicht das Laden der DLLs sonder das Laden von den Abhängigkeiten dieser DLLs.

Wenn du z.B. versucht jogl_awt.dll zu laden wird dabei versucht werden deren Abhängigkeiten mitzuladen (z.B. jogl.dll).
Da Java nicht weiß wo es diese suchen soll muss der library-path entsprechend gesetzt werden.

AFAIK kann man dort wie bei der PATH-Variable einzelne Verzeichnisse auch durch ; getrennt einfügen.

Das Verhalten so ist wichtig, damit auch die gewünschte Version einer DLL geladen wird. Sonst kann Java nicht unterscheiden ob du lieber die jogl.dll aus win32 oder die aus win64 haben willst.

Hiermit kannst du übrigens herausfinden welche DLLs benötigt werden:
Dependency Walker (depends.exe) Home Page
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
R JNI-Dlls aus dynamischen Wrapper-Klassen laden Allgemeine Java-Themen 14
D .dlls mit Java verwenden Allgemeine Java-Themen 2
M JNI mit vorhandenen libs oder dlls verwenden Allgemeine Java-Themen 2
D dlls und jar archive Allgemeine Java-Themen 4
H Pfade von DLLs festlegen Allgemeine Java-Themen 2
R Signieren von Java-Prog. oder Applets - Zugriff auf dlls Allgemeine Java-Themen 8
P DLLs nutzen Allgemeine Java-Themen 3
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
N Lottowebsite programmieren mittels Java, HTML,.... Allgemeine Java-Themen 7
W PDFs signieren mittels IText / Lowagie Allgemeine Java-Themen 0
Zrebna Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder Allgemeine Java-Themen 14
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
J GUI-Einstellungen mittels Preferences Allgemeine Java-Themen 6
Todesbote JFileChooser im Vordergrund (*.jar wird mittels shell_exec in PHP aufgerufen) Allgemeine Java-Themen 1
E Videosequenz mittels Java aus Video schneiden Allgemeine Java-Themen 10
B Ordner öffnen mittels Java in Linux-Umgebung Allgemeine Java-Themen 7
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
RySa Variablenname mittels Reflexions rausbekommen (als String) ? Allgemeine Java-Themen 9
T Wie rufe ich mittels String-Inhalts eine Methode auf? Allgemeine Java-Themen 3
T Exif mittels Java auslesen Allgemeine Java-Themen 14
A Sudoku mittels Backtracking Problem Allgemeine Java-Themen 6
7 Webseiten mittels Java auslesen Allgemeine Java-Themen 7
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
X String zerlegen mittels regulärem Ausdruck Allgemeine Java-Themen 31
O Programm mittels Java installieren Allgemeine Java-Themen 15
S Array-Sort mittels Binärsuche Allgemeine Java-Themen 2
J Setter mittels invoice aufrufen Allgemeine Java-Themen 4
S Eingabeprüfung mittels Regexp Allgemeine Java-Themen 5
J Objekt in Datei speichern mittels Streams Allgemeine Java-Themen 6
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
E Aus mehreren PDFs eines machen, zusammenfügen mittels iText Allgemeine Java-Themen 1
G Graph mittels Punkte erstellen Allgemeine Java-Themen 27
M Problem bei PDF-Anzeige mittels Acrobat Viewer Bean Allgemeine Java-Themen 2
G HTML Code aus String mittels REGEX entfernen Allgemeine Java-Themen 2
spacegaier Performanceproblem beim Einlesen aus Datei mittels Threads Allgemeine Java-Themen 23
G Screenshot mittels robot ausführen Allgemeine Java-Themen 4
B Html Formulare mittels Java automatisch senden Allgemeine Java-Themen 5
E import mittels Eclipse Allgemeine Java-Themen 3
F mittels Collection<A> an A.class kommen? Allgemeine Java-Themen 7
T IF Abfrage + YES_NO Option mittels JOptionPane Allgemeine Java-Themen 3
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
J Tonbalance mittels JMF regeln Allgemeine Java-Themen 3
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
G eigener logger mittels classe (dynamische logfilename) log4j Allgemeine Java-Themen 15
K Mittels Generics eine Methode verallgemeinern Allgemeine Java-Themen 2
A FTPS bzw. FTP over SSL mittels Java Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
G mysql datum umwandeln mittels jsp Allgemeine Java-Themen 10
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
Natorion Erkennen ob das Programm mittels Jar-Datei oder class . Allgemeine Java-Themen 9
P E-Mails mittels POP3 abrufen Allgemeine Java-Themen 2
S mail von server mittels mailapi löschen Allgemeine Java-Themen 2
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Lottospielen mit System, Versuch 2, noch umständlicher als vorher Allgemeine Java-Themen 1
J Frage zu System.getproperties. Allgemeine Java-Themen 60
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
F Frage zu System.in Allgemeine Java-Themen 3
E System property setzten Allgemeine Java-Themen 8
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
O Beziehung System.exit(x) <>Errorlevel Allgemeine Java-Themen 2
B System.out Ausgabe auf jtextarea Fehlersuche Allgemeine Java-Themen 8
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
H Im Tiled-Map-System ein Item anklicken Allgemeine Java-Themen 0
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Login System Allgemeine Java-Themen 19
A BufferedReader ohne System.in Allgemeine Java-Themen 9
VfL_Freak JDK installieren System-Property "user.dir" Allgemeine Java-Themen 6
J System.arraycopy ergibt anderes Resultat als for-loop Allgemeine Java-Themen 4
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
D Java System.out::println Allgemeine Java-Themen 1
D Methoden Java Applikation Die System Auslastung optimieren ? Allgemeine Java-Themen 7
S Ist Java ein geschlossenes System? Allgemeine Java-Themen 2
L Erste Schritte Suche Java Wiki System? Allgemeine Java-Themen 5
chuxXo System/JLayer Volume ändern Allgemeine Java-Themen 0
Neumi5694 System.out und System.err umleiten - NICHT im Quelltext Allgemeine Java-Themen 4
X System.out/err(Die Console) in JTextArea ausgeben Allgemeine Java-Themen 2
S Best Practice System.arrayCopy verändert Ziel-Array Allgemeine Java-Themen 2
A Methoden Der Sinn von system.out.print(); Allgemeine Java-Themen 9
A System freezes when trying to run external command from Java with wait for Allgemeine Java-Themen 3
A Java | Login-System Allgemeine Java-Themen 3
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
Joew0815 Best Practice Wie am besten Plugin-System erstellen? Allgemeine Java-Themen 12
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
F Benachrichtigungs-System Webapp Java Servlet Allgemeine Java-Themen 10
M collection persistence system Allgemeine Java-Themen 4
V System.out.println an jeder Stelle im Projekt löschen Allgemeine Java-Themen 4
D System.out's in String speichern. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben