You are not logged in.

  • Login

1

Friday, July 1st 2011, 8:13pm

DLL oder .so Datei im JAR laden

Hallo,

ich muss für ein Projekt einige nativen Methoden die mit C geschrieben sind in Java ausführen.

Die Sache ist, das Projekt soll später einfach über eine Jar gestartet werden können und funktionieren.

Ich habe mich bisschen informiert aber ich finde nicht so wirklich hilfreiches :(. Mein Problem besteht darin das ich nicht so wirklich weiß oder es auch nicht funktioniert was ich bisher mache um die DLL im Jar zu laden.

Ich benutzt Eclipse als IDE für Java (leider :D) und dort habe ich im Projektordner meine dll Datei reingefügt. Allerdings rufe ich über System.load(Klasse.class.getResource...) die dll auf und deswegen muss die auch im bin Ordner sein =/.
Da ist schon das erste Problem - zum exportieren muss die im Projektordner und zum laden und starten (IN Eclipse) im /bin Ordner.

Wenn ich das Projekt nun als Jar exportiere ist meine dll Datei im Hauptordner drin. Aber wie kann ich diese dll nun IM JAR aufrufen?

2

Friday, July 1st 2011, 9:16pm

Hallo,

Das geht so mit JNI gar nicht. Die Native-Lib muss für das Betriebssystem erreichbar sein, und das ist sie in einer JAR-Datei nicht. Den einzigen Hack, den ich kenne, ist die Lib aus der Jar zu extrahieren und irgendwo auf der Platte abzulegen. Dann kannst du sie mit System.loadLibrary(dateiname) laden.

mfg
ButAlive

3

Friday, July 1st 2011, 9:30pm

Hallo,

danke für die Antwort! Ja, so in der Art habe ich das auch gelesen und inzwischen es hinbekommen die DLL zu extrahieren (über Input / Output Stream) und dann im getproperty(user.home) Verzeichnis ablege. Danke!

Das selbe Problem dass das System auf die Jar nicht zugreifen kann ist aber unter Linux auch so oder?

Wär über weitere Infos oder Ideen/Techniken darüber noch dankbar!

EDIT: Noch schnell die Frage: Welcher Pfad ist die Startposition für System.load()? Also wenn ich da was angebe wie z.B. test.dll - sucht der das in dem Ordner wo die Jar ausgeführt wird?

This post has been edited 1 times, last edit by "Illidan" (Jul 1st 2011, 9:40pm)


4

Friday, July 1st 2011, 10:07pm

Hi,

Ich gehe davon aus, dass es sich unter Linux genau so verhält, ohne es probiert zu haben.

Wenn ich die Doku zu System.load richtig verstehe, dann muss immer ein kompletter Pfad angegeben werden, relative Pfade gehen also nicht, womit sich deine Frage zu Startposition erledigt hat.

http://download.oracle.com/javase/6/docs….lang.String%29

Quoted

Loads a code file with the specified filename from the local file system as a dynamic library. The filename argument must be a *complete* path name.



mfg
ButAlive

5

Friday, July 1st 2011, 10:27pm

Okay, dankeschön!

Jetzt ist nur noch die Frage ob ich die Dateien (also die Libraries und XML Dateien die ich noch erstelle und lese/editiere) in dem Verzeichnis anlege wo die Jar sich befindet oder im user.home Verzeichnis =/. Bei user.home habe ich doch eigentlich die Sicherheit das es auf jeden Fall funktioniert weil der Benutzer immer Schreibzugriffe dadrauf hat? Das wäre doch dann die bessere Methode?

6

Friday, July 1st 2011, 10:52pm

Wenn es dir hilft, hab vorher mal im Code von SWT gespickt, die machen das genau so mit den native-libs. Extrahiert werden dabei die Dateien in einen Unterordner von user.home. Wegen den Schreibrechten ist das wohl das sicherste. Mit den XML-Dateien würde ich genau so verfahren.

7

Wednesday, July 20th 2011, 7:15pm

Hallo,

ich verlier langsam die Nerven bei Java mit Dateiorten und sonst was :(.

Ich bin jetzt doch _diesmal_ umgestiegen das ich die native libs direkt neben dem Jar entpacke.

Leider kriege ich das gar nicht so genau hin wie ich das haben will und sogar zweifel ich daran das ich das gescheit mache da es teilweise gar nichts bringt irgendwie....

Ich hab einmal mein Projektordner mit XML Dateien, src, bin, native_libs. Dann will ich später meine Jar Datei erstellen, die beim Start die jeweilige Library aus "native_libs" entpacken soll.

Das Problem ist jetzt: Wenn ich mein Projekt so starte entpackt der mir den kram erstmal direkt in ./ (vom Projektordner) und auf diese greift er dann auch zu (im Programm dann). Das ist ja dann eigentlich redundant da ich die einmal im ./-Wurzel habe und in native_libs?? Der Sinn mit dem extrahieren war ja nur bei dem Jar, gibts da irgendeine saubere Lösung :(?

Und zweitens: Ich versage irgendwie einfach an den Zugriff von Dateien, oder das Ausgeben des aktuellen Verzeichnis....mit Datei.class.getClassLoader.getResourceAsStream() befindet er sich doch in ./bin-Ordner? Wie kann ich jetzt ins ./ kommen? In einem Forum habe ich es mittels "new File("").getAbsolutePath()+"datei" - aber so sauber ist es ja auch wieder nicht :(.

Und dann kommt das Problem halt mit dem System.load() - hier brauche ich ja den Absoluten Pfad zur Datei.

Kann mir da einer helfen :(?

Similar threads

Social bookmarks