000
28.03.2006, 12:29 Uhr
Knutsen
|
Hallo.
Ich möchte bei mir als Test für ein sehr wichtiges Projekt JNI zum Laufen bekommen. Dabei klappt eigentlich alles bis zum Punkt des Einladens der DLL innerhalb Javas. Nur dann findet er die Methode nicht. Das Ergebnis ist nämlich folgende Exception:
Code: |
Exception in thread "main" java.lang.UnsatisfiedLinkError: abc at JniTest.abc(Native Method) at JniTest.main(JniTest.java:10)
|
Würde er die DLL selbst nicht finden, dann gäb es das (durch Umbenennung der DLL gecheckt):
Code: |
java.lang.UnsatisfiedLinkError: no JniTest in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682) at java.lang.Runtime.loadLibrary0(Runtime.java:822) at java.lang.System.loadLibrary(System.java:992) at JniTest.<clinit>(JniTest.java:4)
|
Der Fehler muss deswegen wohl innerhalb der DLL zu finden sein(?). Ich möchte im Folgenden mal alle Schritte auflisten, die ich gemacht habe. Vielleicht kann mir jemand helfen, so daß ich auch etwas kompliziertere Sachen mit JNI angehen kann. ;)
Innerhalb der Schritte habe ich ggf. den Befehl angegeben, danach eine etwaige Ausgabe und den Inhalt der produzierten Datei oder den Dateinamen, falls Binärcode.
Ale Compiler benutze ich gcc.
1) Die Java-Klasse -------------------
Code: |
public class JniTest {
static { System.loadLibrary("JniTest"); }
public static native void abc();
public static void main(String[] args) { abc(); }
}
|
2) Die mit javah produzierte Header-Datei für C++ --------------------------------------------------
BEFEHL: "c:\Coding\Tools\Java\JDK1.5\bin\javah -jni -o jnitest.h JniTest"
AUSGABE: - keine -
PRODUZIERT:
C++: |
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JniTest */
#ifndef _Included_JniTest #define _Included_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: JniTest * Method: abc * Signature: ()V */ JNIEXPORT void JNICALL Java_JniTest_abc (JNIEnv *, jclass);
#ifdef __cplusplus } #endif #endif
|
3) Erstellung des C-Source-Code für die native Methode abc() -------------------------------------------------------------
C++: |
#include <jni.h> #include "JniTest.h"
JNIEXPORT void JNICALL Java_JniTest_abc( JNIEnv *env, jclass clazz ) {
return;
}
|
4) Kompilierung des C-Code in Objekt-Datei -------------------------------------------
BEFEHL: "gcc -c -I C:\Coding\Tools\Java\JDK1.5\include -I C:\Coding\Tools\Java\JDK1.5\include\win32 JniTest.c"
AUSGABE: - keine -
PRODUZIERT: JniTest.o
5) Linking der Objektdatei mit anderen Libraries und Umwandlung in DLL -----------------------------------------------------------------------
BEFEHL: "ld -shared JniTest.o -o JniTest.dll"
AUSGABE: - keine -
PRODUZIERT: JniTest.dll
6) Kopieren der dll in ein passendes Verzeichnis, damit die JVM sie auch findet --------------------------------------------------------------------------------
Mit der Ausgabe des java.library.path habe ich mir angeschaut, wo die JVM sucht, und die dll dann einfach in das Binär-Verzeichnis meines MinGW geschoben.
7) Ausführen von JniTest.class -------------------------------
BEFEHL: "C:\Coding\Tools\Java\JDK1.5\bin\java.exe JniTest"
AUSGABE:
Code: |
Exception in thread "main" java.lang.UnsatisfiedLinkError: abc at JniTest.abc(Native Method) at JniTest.main(JniTest.java:10)
|
Dieser Post wurde am 28.03.2006 um 12:30 Uhr von Knutsen editiert. |