[JNI] aus einer nativen JNI-DLL eine entsprechenden JAR-Datei erzeugen ****

vfl_freak

Premium-User
Guten morgen,

vorab: ich bin leider noch ein ziemlicher Anfänger, was derartige Aktionen mit Java angeht - habe bislang in einem übernommenen Projekt zumeist mit dem JBuilder2007 und einem fertigen build.xml gearbeitet. Seit zwei Wochen arbeite ich aber auch (parallel mit der "Eclipse IDE for Java Developers (Helios SR1)" ...

In dem genannten Projekt wird über ein JNI-Interface u. a. die MAC-Adresse und die Windows-ProductID ermittelt. Da dies unter Win7 nicht mehr funktionierte, musste ich entsprechende DLL mit C++ anpassen und neu erzeugen.
Habe ich die DLL nun lokal im workspace liegen, wird sie an der entspr. Stelle auch sauber geladen und ausgeführt. Um sie nun aber anderen Anwendern zur Vefügung zu stellen, benötige ich ja IMHO eine entsprechende JAR-Datei gleichen Namens, die diese DLL und eine entspr. Manifest-Datei enthält. Die Manifest-Datei " macaddrwin.mf" habe ich so aufgebaut:
Code:
Manifest-Version: 1.0
Main-Class: macaddrwin.dll

Wenn ich es richtig verstehe, muss ich ja nun beide Dateien in eine gleichnamige JAR-Datei packen und dann signieren (letzteres kann ich problemlos mit dem vorliegenden ant-Script machen).
Aber wie erzeuge ich nun die JAR-Datei ****
Bei meinem Versuch (analog zu den hier genannten Links) scheitern schon daran, dass ich im Export-Dialogs die DLL nicht als Quelle auswählen kann. Hier wird immer nur ein bestehendes Projekt verlangt ...

Kann man dies auch irgendwie von Hand machen über das CMD "jar" machen?

Ich hoffe, dass mir irgendwer hierbei weiterhelfen kann :)

Danke und Gruß
Klaus
 
Deine DLL wird von Java aus geladen. Das heißt irgendwo im Java-Code gibt es einen Aufruf System.load(String) od. System.loadLibrary(String).

Bei System.load(String) gibt man einen Dateinamen an, bei System.loadLibrary nur den Library-Namen (zB macaddrwin, ohne .dll) und Java sucht dann im Java-Library-Path (System-Property java.library.path) nach der "macaddrwin.dll".

Das bedeutet, wenn Du nur die Implementierung der Funktionen in der DLL angepasst hast, sollte es reichen, wenn Du die alte DLL durch die neue DLL ersetzt.
 
Also ich habe das mal ohne Signatur gelöst - und ohne Manifest.mf, stattdessen habe ich die API JNA https://jna.dev.java.net/ genutzt.
Schau dir am besten die Dokumentation dazu an, dann kannst du dir die Mühe für JNI sparen.
Wenn deine DLL nicht geladen werden kann, kopiere sie einfach in eines der Verzeichnisse, die von
System.getProperty("java.library.path")
angegeben werden und lade sie von dort.
 
Moin,

erstmal Danke für Eure Antworten :)
Ich muss mich morgen nochmals damit beschäftigen, da heute Nachmittag eine andere dringende Sache dazwischen gekommen war :-(

Danke und Gruß
Klaus
 
Howdie.

Wie genodeftest schon gesagt hat, würde ich JNA mal testen.
Doch trifft die Aussage von Billie auch hier zu: Die Bibliothek muss aus dem entsprechenden Pfad ausgelesen werden, nur dass es sich hier um die Property "jna.library.path" handelt. Ich gebe diese Info meistens als Start-Parameter (Batch, exe-Wrapper) mit, z.B. "-Djna.library.path=Data/Lib".

Hab inzwischen ein bissl Erfahrung mit JNA/DLLs, falls es Fragen gibt, immer her damit.

Gruß
miffi
 
Moin,

Deine DLL wird von Java aus geladen. Das heißt irgendwo im Java-Code gibt es einen Aufruf System.load(String) od. System.loadLibrary(String).

Richtig, ich verwende "LoadLibrary".
Augenscheinlich wird diese Lib dann ja auch direkt von WebServer geholt, da sie mit
Java:
<nativelib href="macaddrwin.jar"/>
in der JNLP-Datei eingetragen und das JAR wohl selbstentpackend ist.

Habe das Ganze gestern Abend noch hin bekommen, in dem ich (analog zu http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/jar.html) einfach folgendes ausgeführt habe:
Java:
jar cmf macaddrwin.mf macaddrwin.jar macaddrwin.dll

Anschließend habe ich die entstandene JAR_Datei signiert (über meine build.xml) und auf den Webserver gelegt!
Klappt einwandfrei :p

Nochmals Danke an alle für die Gedankenanstösse :)
Gruß
Klaus
 
Zurück