DLL aus jar extrahieren und als lib nutzen

moccajoghurt

Bekanntes Mitglied
Hallo,
ich muss für mein aktuelles Projekt eine DLL aus einer jar extrahieren und dann mit der JNI nutzen:

So ist der Ablauf:
Runnable Jar wird ausgeführt -> DLL wird in in ein beliebiges Verzeichnis entpackt -> DLL wird mit System.load("DLL-Path") geladen.

Leider finde ich kein brauchbares Beispiel wie ich das mache. Google spuckt nur Ergebnisse aus, bei der die Klasse "ACWrapper" genutzt wird. Keine Ahnung was es damit auf sich hat (muss man die selber schreiben? kann man die wo downloaden? importieren kann ich sie jedenfalls nicht...).
Weiß jemand wie ich am besten vorgehe?
Gruß,
moccajoghurt
 

moccajoghurt

Bekanntes Mitglied
Hab's jetzt folgendermaßen gelöst:

(nur der relevante Teil)
Java:
		File new_dll = new File(file_path_string, "temp64.dll");

		try {
			InputStream istream = getClass().getClassLoader()
					.getResourceAsStream("temp64.dll");
			OutputStream ostream = new FileOutputStream(new_dll);

			byte buf[] = new byte[8192];

			int len;

			while ((len = istream.read(buf)) != -1) {
				ostream.write(buf, 0, len);
			}

			istream.close();
			ostream.close();

		} catch (Exception e) {

		}
 

Marco13

Top Contributor
OK, wenn Betreiebssystem, Speicherort der temprorären Datei (und deren mögliches schon-Vorhandensein) und Fehlerbehandlung(!) keine Rolle spielen ist's wirklich nicht viel ;)
 

moccajoghurt

Bekanntes Mitglied
Ok ich habe ein neues Problem:

Wenn ich das ganze von Eclipse aus starte funktioniert alles. Wenn ich das Projekt dann allerdings als jar exportiere, dann kann er die DLL nicht laden, obwohl sie im entsprechenden Pfad liegt.
Also nach:
Java:
static {
System.load(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll");
}

Bricht das Programm ab. Allerdings liegt die DLL definitiv in diesem Ordner (ich hab nachgeschaut).

Woran liegt das und wieso passiert das nur, wenn ich mein Programm als Runnable Jar starte?
 

XHelp

Top Contributor
1. Was heißt "Bricht das Programm ab"?
2. temp-0.0 in Dokumenten, im ernst?

P.S. Irgendwann mal habe ich sowas ähnliches geschrieben:
Java:
public class NativeLibLoader {
        private static final String LIB_NAME = "somelib-";
        private static final String LIB_PATH_IN_JAR = "/lib/";
        static {
                loadFromLibraryPath(LIB_NAME+System.getProperty("os.arch"));
        }
        
        private static void loadFromLibraryPath(String libraryName) {
                try {
                        System.loadLibrary(libraryName);
                } catch (UnsatisfiedLinkError e) {
                        e.printStackTrace();
                        loadFromJar(libraryName);
                }
        }


        private static void loadFromJar(String libraryName) {
                long randomPart = new Date().getTime();
                File libFile = new File(System.getProperty("java.io.tmpdir") + "/"
                                + "JST_" + randomPart + LIB_PATH_IN_JAR + libraryName + ".dll");
                InputStream in = NativeLibLoader.class
                                .getResourceAsStream(LIB_PATH_IN_JAR + libraryName + ".dll");
                try {
                        if (libFile.getParentFile().mkdirs()) {
                                FileOutputStream fw = new FileOutputStream(libFile);
                                byte[] b = new byte[1024];
                                int noOfBytes = 0;
                                while ((noOfBytes = in.read(b)) != -1) {
                                        fw.write(b, 0, noOfBytes);
                                }
                                in.close();
                                fw.close();
                        }


                } catch (IOException e) {
                        e.printStackTrace();
                }
                System.load(libFile.toString());
        }
}

vlt hilft es dir ja irgendwie weiter
 
Zuletzt bearbeitet:

moccajoghurt

Bekanntes Mitglied
Hab das Verzeichnis zum testen gewählt, weil es wenig Tipparbeit ist. Wenn alles funktioniert ändere ich das.

Naja ich habe zum Testen einen JFrame erstellt, der angezeigt wird (wusste nicht wie ich bei einer Jar testen soll wo das Programm aufhört zu funktionieren).

So wird der Frame angezeigt:
Java:
	static {
		// Frame zum Test, ob bis hierhin alles funktioniert hat
		JFrame frame = new JFrame();		
		frame.setLocationRelativeTo(null);
		frame.setSize(200,300);
		frame.add(new JLabel(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll"));
		frame.setVisible(true);
		//jetzt die DLL laden
		System.load(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll");
	}

So dann nicht mehr:
Java:
	static {
		//jetzt die DLL laden
		System.load(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll");
		// Frame zum Test, ob bis hierhin alles funktioniert hat
		JFrame frame = new JFrame();		
		frame.setLocationRelativeTo(null);
		frame.setSize(200,300);
		frame.add(new JLabel(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll"));
		frame.setVisible(true);
	}

Daher muss es wohl an dem Laden der DLL scheitern.
 
Zuletzt bearbeitet:

moccajoghurt

Bekanntes Mitglied
Der einzige Unterschied zwischen deiner Methode und meiner ist, dass meine DLL nicht ins java tmpdir geladen wird, sondern eben in home-Verzeichnis. Also die Datei ist definitiv da, es muss irgendwie an
Java:
System.load(System.getProperty("user.home") + "\\Documents\\temp-0.0\\temp64.dll");
in Verbindung mit der Runnable Jar liegen. Schließlich ist die DLL ja auch ansprechbar, wenn ich das Programm von Eclipse aus starte.
Ich kanns mir nicht erklären.
 

XHelp

Top Contributor
Kannst ja vernunftige catch-Blöcke schreiben und schauen, was wirklich schief geht.
Oder eben dein Programm aus der Konsole starten
 

moccajoghurt

Bekanntes Mitglied
Irgendwas stimmt da nicht. Wenn ich die Jar mit
Code:
java -jar blub.jar
starte, wird sie zwar ausgeführt, aber ich sehe keine ausgaben.
Habe sogar extra einen Fehler eingebaut, damit eine Exception geworfen wird, aber es wird nichts angezeigt.
 

moccajoghurt

Bekanntes Mitglied
Ok es hängt irgendwie mit den anderen Klassen in meinem Projekt zusammen.
Habe jetzt nur die für die DLL relevanten klassen in ein neues Projekt gezogen. Wenn ich diese jar starte werden sowohl Ausgaben angezeigt, sowie die DLL geladen (obwohl es diesmal per jar gestartet wurde).
Ist es irgendwie möglich, dass die andern Klassen sich gegenseitig stören? (Ich habe als Startpunkt nur die für die DLL relevante Klasse angegeben, die die andern Klassen eigentlich komplett in Ruhe lässt).
 
Zuletzt bearbeitet:

moccajoghurt

Bekanntes Mitglied
Ok hab den Fehler gefunden.
Die DLL war in 64bit kompiliert. Wenn ich das Programm von Eclipse aus starte arbeitet Java in 64bit, aber wenn ich es als Runnable Jar ausführe, arbeitet die JVM in 32bit.
Hab es jetzt so gelöst, dass ich mit
Java:
System.getProperty("sun.arch.data.model")
abfrage ob es 32bit oder 64 bit sind und habe eine 32bit und eine 64bit kompilierte DLL und lade dann die entsprechende.
 

moccajoghurt

Bekanntes Mitglied
Ach MIST da denkt man, man hat das Problem gelöst und dann gibts doch wieder was Neues. Also bei mir läuft alles, aber hab die Jar mal probeweise auf einem anderen Rechner gestartet und da kommt auf einmal nen ganz anderer Fehler:
Java:
java.lang.UnsatisfiedLinkError: C:\Users\Tim\Documents\temp-0.0\temp32.dll: Can't find dependent libraries
Die DLL lag aber im Ordner, also bin ich wieder ratlos.
 
S

Spacerat

Gast
Vermutlich greift tmp32.dll ihrerseits auf andere dynamisch verlinkte DLLs zu, die entweder gar nicht oder nicht korrekt installiert wurden.
 

moccajoghurt

Bekanntes Mitglied
Hmm eigentlich besteht die DLL aus nur einem Header und einer Source, in der ich folgendes include:
Code:
#include "stdafx.h"
#include <WinUser.h>
#include <Windows.h>
#include <jni.h>
#include <iostream>
#include "ReceiveKeys.h"

Visual Studio hat da aber neben meinen JNI Header "stdafx.h" und "targetver.h" standardmäßig dazugepackt.
Neben meiner eigenen Source wurde noch "dllmain.cpp" und "stdafx.cpp" erstellt, bei denen ich aber nichts modifiziert habe.

Wie finde ich denn heraus welche dynamisch verlinkte DLLs meine benutzt und füge die so hinzu, dass ich mein Programm auch auf andern Rechner ausführen kann?
 
S

Spacerat

Gast
Also bis auf dieses ReceiveKeys (RK) ist ja meines Wissens alles Standard und RK dürfte dabei wohl deine eigene Kreation sein. Aber irgendwo dort sollte was zu finden sein. Wenn nicht, Dependency Walker fragen.
 

Marco13

Top Contributor
Wenn du ohenhin schon Visual Studio installiert hast, kannst du die dependencies auch mit
dumpbin /DEPENDENTS dieDatei.dll
rausfinden, da braucht's keine full-bloated software mehr dafür.
 

moccajoghurt

Bekanntes Mitglied
Code:
dumpbin /DEPENDENTS temp32.dll
Hat bei mir folgende Ausgabe gebracht:
Code:
Dump of file C:\Users\Marius\Documents\temp-0.0\temp32.dll

File Type: DLL

  Image has the following dependencies:

    KERNEL32.dll
    USER32.dll
    MSVCR100D.dll

  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss

Was davon könnte jetzt auf nem anderen Rechner fehlen? Muss ich die dependent DLLs vielleicht einfach mitkopieren?
Allerdings liegen diese 3 DLLs bei mir alle in System32... wie ist es also möglich, dass meine DLL diese nicht findet...?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Schau mal ob auf dem Rechner, auf dem es NICHT geht, die MSVCR100D fehlt (übrigens die Debug-Version - solltest vielleicht im Release-Modus compilieren). Websuche liefert da viele Ergebnisse, aber ich würde nicht irgendeine DLL von einer Dubiosen Seite verwenden - ist diese DLL vielleicht Teil dieser "VC Redistributables" ???:L Ich würd' mal unter Redistributing Visual C++ Files anfangen zu suchen (oder nach einer Möglichkeit suchen, dafür zu sorgen, dass diese DLL nicht mehr benötigt wird - da gibt's im Web Hinweise dazu, aber was konkretes kann ich auf die Schnelle nicht sagen)
 

moccajoghurt

Bekanntes Mitglied
Ok ich hab nachgeschaut, dem Rechner auf dem es nicht geht ist keine MSVCR100D.dll. Kann ich einfach meine MSVCR100D.dll in die Jar kopieren und zusammen mit meinen eigenen DLLs entpacken?
PS: Auf dem Rechner auf dem es nicht geht liegt aber eine MSVCR100.dll (ohne das D am Ende)... hmm.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ahja, das sollte schon reichen: Schau mal, dass du deine temp-DLL im Release-Modus compilierst (im einfachsten Fall oben in der Combo-Box auswählen), dann sollte er auf die ohne "D" verweisen und die entsprechend auch finden.
 

moccajoghurt

Bekanntes Mitglied
Jo thx, ich denke so würde es auch gehen. Habe es gerade so gelöst, dass ich Multi-Threaded kompiliere. Dadurch bestehen irgendwie auch keine Abhängigkeiten mehr. Ich weiß leider nicht genau was genau das jetzt bedeutet, aber es funktioniert.
Danke für deine Hilfe hat mir sehr weitergeholfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
C Outlook msg-Datei Anhänge extrahieren Allgemeine Java-Themen 2
C jar Archiv im Programm aus dessen jar extrahieren Allgemeine Java-Themen 2
F Calss Datei mit allen Ressources extrahieren Allgemeine Java-Themen 5
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
P Font aus PDF extrahieren -> im Panel anzeigen Allgemeine Java-Themen 3
J String filtern / XML-Code extrahieren Allgemeine Java-Themen 4
L Private Key aus KeyDatei extrahieren Allgemeine Java-Themen 2
P Tonspur aus Video extrahieren und konvertieren Allgemeine Java-Themen 2
D [win] icon aus exe extrahieren Allgemeine Java-Themen 5
J URLs aus HTML Datei extrahieren Allgemeine Java-Themen 2
D Bilder extrahieren aus EPS - Problem mit ASCII85 Allgemeine Java-Themen 2
S JavaDoc aus .class Datei extrahieren Allgemeine Java-Themen 5
T [htmlparser.sourceforge.net] Attribute extrahieren Allgemeine Java-Themen 3
B Film aus Java JAR-Archiv extrahieren Allgemeine Java-Themen 4
J PDF Content extrahieren mit JPO Allgemeine Java-Themen 5
M Embedded Files aus PDF extrahieren Allgemeine Java-Themen 3
S Daten extrahieren aus Excel Dateien (auch 2k7) Allgemeine Java-Themen 4
M TIFFs aus PDF extrahieren Allgemeine Java-Themen 4
C Textteile aus Strings extrahieren? Allgemeine Java-Themen 6
C Alle Möglichen Substrings der Länge k aus String extrahieren Allgemeine Java-Themen 9
R Text aus PDF extrahieren Allgemeine Java-Themen 2
spacegaier Kommastellen aus float extrahieren Allgemeine Java-Themen 13
P Bits extrahieren Allgemeine Java-Themen 5
K Verzeichnis rekursiv aus JAR-Datei extrahieren Allgemeine Java-Themen 6
J Packet aus JRE 6 für JRE 5 "extrahieren" Allgemeine Java-Themen 4
RaoulDuke Reguläre Ausdrücke - Daten extrahieren Allgemeine Java-Themen 3
R Text aus PDF extrahieren Allgemeine Java-Themen 1
M URL aus einem String extrahieren, mit reg. Ausdrücken? Allgemeine Java-Themen 19
M CAB Files extrahieren / entpacken Allgemeine Java-Themen 4
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
berserkerdq2 Shapes als Buttons nutzen, schlechter Programmierstyle? Allgemeine Java-Themen 1
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
xYurisha Nutzen von Importmethoden bei Klasseninstanzen Allgemeine Java-Themen 12
Neumi5694 Best Practice Vorhandene Programminstanz nutzen Allgemeine Java-Themen 3
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
Neumi5694 Offenes Programm nutzen Allgemeine Java-Themen 4
T javax.script (JavaScript): Nicht-JRE-Packages importieren/nutzen Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
B Lua als Konfigurationsdatei nutzen - ein Krampf Allgemeine Java-Themen 4
F Über Java Google Suche nutzen Allgemeine Java-Themen 11
A COM und JAVA nutzen Allgemeine Java-Themen 1
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
D Nutzen, erst deklarieren, oder neu erstellen? Allgemeine Java-Themen 11
S lp_solve mit Java nutzen - Can't find dependent libraries Allgemeine Java-Themen 8
T HTTP HttpWebRequest in Swing-Projekt nutzen Allgemeine Java-Themen 4
G RXTX in proprietärer Software nutzen?! Allgemeine Java-Themen 10
C Variablen Variable einer Klasse in einer anderen Klasse Nutzen Allgemeine Java-Themen 8
thetagman Programmidee: VirtualCorkboard - Evaluation, Nutzen & Meinung Allgemeine Java-Themen 12
D Darf ich jakarta bibliotheken ohne weiteres nutzen? Allgemeine Java-Themen 10
S Profiler-Funktionen in eigener Applikation nutzen..? Allgemeine Java-Themen 5
C Kann Methode nicht aus Klassenname implements Runnable nutzen Allgemeine Java-Themen 7
G C# DLL in Java nutzen Allgemeine Java-Themen 4
T cpp Programm via jna in java nutzen Allgemeine Java-Themen 3
Meldanor Datei aus jar nutzen Allgemeine Java-Themen 4
J Alte version nutzen Allgemeine Java-Themen 4
M Rechenweg in Datenbank speichern und nutzen Allgemeine Java-Themen 6
G konstanter String[] laesst sich nicht in Annotation nutzen Allgemeine Java-Themen 2
G Variable global nutzen Allgemeine Java-Themen 4
D Welches Pattern kann ich nutzen? Allgemeine Java-Themen 9
H StartupFolder nutzen! Aber wie? Allgemeine Java-Themen 4
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
V Setter zum Berechnen nutzen? Allgemeine Java-Themen 5
G Was nutzen statt Mehrfachvererbung? Allgemeine Java-Themen 7
R Wie Google & Co mit Java nutzen? Allgemeine Java-Themen 16
W InputStream öfters nutzen Allgemeine Java-Themen 9
H einzelner Thread --> Nutzen?! Allgemeine Java-Themen 3
L Wie Pattern anwenden um Cipher zu nutzen Allgemeine Java-Themen 2
G DB connection in anderen Klassen nutzen! Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
E NT-Anmeldung in Java Client-Applikation nutzen. JAAS ? Allgemeine Java-Themen 5
M java api offline nutzen? Allgemeine Java-Themen 4
J COM-Port unter Windows nutzen Allgemeine Java-Themen 2
B Programm unter GPL nutzen Allgemeine Java-Themen 6
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
T GPL Code inkommerzieller Software nutzen? Allgemeine Java-Themen 26
G Funktionstasten nutzen Allgemeine Java-Themen 3
S Klassen aus JDK 1.5. außerhalb von 1.5. nutzen Allgemeine Java-Themen 6
S MediaTracker nutzen um festzustellen ob schreibvorgang ende. Allgemeine Java-Themen 5
M Webstart nutzen? Allgemeine Java-Themen 9
thE_29 Externe (unbekannte) Klasse nutzen Allgemeine Java-Themen 11
P DLLs nutzen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben