Java Jni + dll

skratchi.at

Ensign
Registriert
Dez. 2008
Beiträge
205
Hi Leute =)

ich habe ein problem mit der JNI von java und bekomme es nicht gelöst.

ich habe eine dll die in c geschrieben wurde und möcht die beinhalteten funktionen in java nutzen.
die funktionen beschäftigen sich mit der kommunikation mit einem interfaceboard.

eig wär ich davon ausgegangen das dies ohne weiters mal möglich ist, da sich das jni doch damit beschäftigt oder nicht?! protierung von c code in java oder stimmt das nur wenn man den c code selber schreibt.

ich hab mal folgende schritte gemacht.
- java projekt erstellt - zwangsweise
- eine klasse erstellt die die native funktionen zur verfügung stellt
Code:
package k8055;

public class k8055_funktion {
	static {
		System.loadLibrary("K8055D_C");
	}
	public static native void CloseDevice();
	public static native int OpenDevice(int dev_num);
}
- und eine andere klasse erstellt, die das main enthält und eben die funktionen mal testweise aufrufen soll
Code:
package k8055;

public class k8055_main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int i = k8055_funktion.OpenDevice(0);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		k8055_funktion.CloseDevice();
		}

}

- weiters habe ich auch eine header datei angelegt mit javah, was ich iwie herausgefunden habe, das man es braucht.


aber wenn ich das ganze ausführe kommt folgender fehler:
Exception in thread "main" java.lang.UnsatisfiedLinkError: k8055.k8055_funktion.OpenDevice(I)I
at k8055.k8055_funktion.OpenDevice(Native Method)
at k8055.k8055_main.main(k8055_main.java:9)


des öfteren habe ich schon gelesen man braucht eine zwischen dll, nur habe ich nicht gefunden wie diese aussehen soll oder erstellt werden kann.
brauche ich eine?

wenn ja, wie kann ich die erstellen
UND wie soll der code aussehen
(meiner meinung nach, besitze ich genug kenntnisse in c, damit mir das jmd erklären kann, weil gelernt habe ich nocht nicht bzw. werden wir es auch nicht mehr)


wenn nein, was mache ich noch falsch!


wie komme ich am schnellsten zu einem ergebnis, das funktioniert und auch nicht zu schlampig ist.

lg
skratchi
 
Ein kleiner Fehler im Tutorial: Du musst zusätzlich unter Windows Deine %PATH% Variable um den Pfad erweitern, in welchem die dll liegt.

Poste auch mal bitte die von Dir erzeugten C-Files.
 
Ich habe mich an das buch "java ist auch eine insel" gehalten.

die dll wird schon gefunden.
ich habe sie in den bin-ordner der jdk kopiert

die dll ist bei der hardware beigelegt.
ich selber hab nur die beiden klassen angelegt und ein h-file erstellt
bisher habe ich noch keine einzigen c-code verfasst.

mittlerweile dreng sich mir der gedanke auf, ich muss eine eigene dll schreiben.

lg
 
Stimmt, die entsprechenden dll's zur JVM kopieren funktioniert auch - ist allerdings auf die Dauer lästig.

Zur Funktionsweise von JNI: Um nativen Code verwenden zu können, muss dieser einer entsprechenden Syntax folgen. Genau deswegen gibt es das Tool zum Erzeugen der Header.

Hast Du die Header erzeugt, implementierst Du daraufhin genau diese Funktionen. In Deinem Fall packst Du dort den Code rein, der die dll ansteuert, die Du verwenden willst.

Eine beliebige Library ohne Wrapper direkt in JNI ansteuern - was Du vermutlich versucht hast - geht nicht.
 
ok...
aufgehds zum c coden... wuhu

naja, dürfte nicht so schwer sein^^

danke leute :)

lg
 
Zurück
Oben