# Native Library einbinden



## jakob (3. Aug 2007)

Hallo zusammen, 

ich habe unter Eclipse eine dll eingebunden, welche von einem Jar benoetigt wird: ProjetProperties > JavaBuildPath > Libraries > Native library location des Jars

Jetzt kann ich das Jar im Eclipse nutzen. 

Mein Problem ist, dass ich das Programm mit ant erstelle und ich nicht weiss wie ich dem Ant sage, dass und wo er die dll reinpacken soll. Ich habe die dll im Classpath und liefere sie auch in dem entsprechenden Verzeichnis mit, klappt aber nicht. Beim Starten des Programms bekomme ich diesem Meldung:


```
ERROR You have not installed the DLL named 'ICE_JNIRegistry.DLL'.
        no ICE_JNIRegistry in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: openSubKey
        at com.ice.jni.registry.RegistryKey.openSubKey(Native Method)
        at com.ice.jni.registry.RegistryKey.openSubKey(RegistryKey.java:185)
        at gui.GUI.createAndShowGUI(Unknown Source)
        at gui.GUI.<init>(Unknown Source)
        at quickzipsearch.Main.main(Unknown Source)
```

Dieselbe Meldung hatte ich bekommen, als ich die dll im Eclipse noch nicht wie oben beschrieben eingebunden hatte. 

Liebe Gruesse,

Jakob


----------



## tuxedo (3. Aug 2007)

Wie startest du dein Programm? Die DLL muss anders beim aufruf von Java angegeben werden als "normale" jars ...

Müsste erst selbst nachschauen wie das ging.. 

- Alex


----------



## tuxedo (3. Aug 2007)

*gefunden*



```
-Djava.library.path=[PATH TO LIB]
```


Das musst du beim Aufruf mit angeben und natürlich aufs passende DLL_Verzeichnis zeigen lassen.

Weiß nicht genau, könnte auch sein dass du das nach dem Programmstart, vor dem laden der DLL, auch nachträglich in die System-Properties eintragen kannst... --> ausprobieren.


----------



## jakob (3. Aug 2007)

Hi Alex, 

so 


```
java -Djava.library.path=ICE_JNIRegistry.dll -jar quickZipSearch.jar
```

 klappts leider nicht, selber Fehler wie vorher. Die dll liegt imselbem Verz wie das jar. 

Wie kann ich die nach dem Systemstart laden?


----------



## tuxedo (3. Aug 2007)

DU sollst den Pfad angeben, nicht die DLL selbst ...


----------



## jakob (3. Aug 2007)

das ist schon klar, habs mit dem absoluten und relativen Pfad versucht. Um einen Pfadfehler auszuschliessen hab ich das Teil direkt ins neben das jar gelegt.


----------



## Murray (3. Aug 2007)

Gefragt ist das Verzeichnis, in dem die DLL liegt, nicht der Pfad inkl. Dateinamen der DLL. Wenn die DLL im gelichen Verzeichnis wie das Jar-File liegt, sollte

```
java -Djava.library.path=. -jar quickZipSearch.jar
```
funktionieren.


----------



## tuxedo (3. Aug 2007)

Ich lege alle Bibliotheken immer in einem Ordner namens "lib" parallell zur JAR.

Auf dein Programm bezogen wäre der aufruf dann so:


```
java -Djava.library.path=./lib -cp=./lib -jar quickZipSearch.jar
```


----------



## Murray (3. Aug 2007)

alex0801 hat gesagt.:
			
		

> ```
> java -Djava.library.path=./lib -cp=./lib -jar quickZipSearch.jar
> ```



Ist die Übergabe von -cp nicht überflüssig, wenn man -jar verwendet? Soweit ich weiß, wird weder der System-Classpath noch der mit -cp übergebene Wert ausgewertet, wenn man eine Anwendung mit -jar starten.


----------



## tuxedo (3. Aug 2007)

Naja, wenn man alle seine Libs in der JAR drin hat, dann ist es "bums". Aber woher soll Java denn wissen wo die Bibliothek XYZ zu finden ist, wenn sie nicht in der Start-JAR enthalten ist, sondern in einem "aufgeräumten" "lib" Verzeichnis liegt ...

- Alex


----------



## Murray (3. Aug 2007)

alex0801 hat gesagt.:
			
		

> Naja, wenn man alle seine Libs in der JAR drin hat, dann ist es "bums". Aber woher soll Java denn wissen wo die Bibliothek XYZ zu finden ist, wenn sie nicht in der Start-JAR enthalten ist, sondern in einem "aufgeräumten" "lib" Verzeichnis liegt ...


Wenn die Anwendung aus dem Start-Jar die Bibliothek XYZ braucht, dann muss XYZ entweder im Start-Jar enthalten sein ("Fat-JAR"-Ansatz), oder das Manifest des Start-Jars muss eine Class-Path-Eintrag mit dem *relativen* Pfad zu XYZ.jar enthalten.


----------



## tuxedo (3. Aug 2007)

Ah, ich verstehe... Da wär ich dann schon drüher drauf gekommen wenn Eclipse mir sowas angeboten hätte, oder hab ich das nur übersehen?

Wie sieht dann die Manifest Beispielsweise aus?
So?


```
Manifest-Version: 1.0
CLASS-PATH: ./lib
```
Und kann ich darin auch den  DLL-File Pfand angeben? oder bleibt mir nur die System-Properties?

- Alex


----------



## Murray (3. Aug 2007)

Wie beim "normalen" Classpath müssen die Jar-Files explizit aufgeführt sein, also

```
Class-Path: lib/XYZ.jar lib/abc.jar
```
Hier sind die einzelnen Einträge zur Abwechslung mal weder durch Semikola, noch durch Dopplepunkte, sondern durch Blanks getrennt.


----------



## tuxedo (3. Aug 2007)

Ähm, in Java 6 muss ich bei der Angabe von "-cp" nur noch auf das Verzeichnis zeigen, und nicht auf jede File (eine der tollen Neuerungen, wie ich gelesen hab).

Ist das beim Manifest dann nicht genau so?


----------



## Murray (3. Aug 2007)

alex0801 hat gesagt.:
			
		

> Ähm, in Java 6 muss ich bei der Angabe von "-cp" nur noch auf das Verzeichnis zeigen, und nicht auf jede File (eine der tollen Neuerungen, wie ich gelesen hab).


Ich verstehe die Doku so, dass man bei -cp zumindest noch ein Sternchen angeben muss, also -cp lib/* (oder doch -cp lib\* ?)




			
				alex0801 hat gesagt.:
			
		

> Ist das beim Manifest dann nicht genau so?


Die Doku gibt dazu nichts her.


----------



## tuxedo (3. Aug 2007)

Naja, auf den * kommts dann ja nicht mehr an. Ich hab halt den vorteil dass ich nicht die ganzen Libs einzeln aufzählen muss. Beim letzten größeren Projekt waren das über 10 Stück.

Mit dem Manifest: Werd ich wohl ausprobieren müssen...


----------



## Gast (10. Aug 2007)

funktioniert das schon bei irgendwem und wen ja wie?


----------



## Gast (11. Aug 2007)

bei mir klappt das irgendwie nicht heul heul


----------

