JNI Beispiel von GalileoComputing -> Problem
-
Hallo,
ich versuche, das JNI-Beispiel von GalileoComputing anzuwenden:
http://www.galileocomputing.de/openbook/javainsel7/javainsel_26_002.htmFolgender Java-Quellcode meiner StrLen.java:
public class StrLen { static { System.loadLibrary( "strlen" ); } public static native int strlen( String s ); public static void main(String[] args) { StrLen strlen = new StrLen(); strlen.strlen("ABC"); } }
Kompilieren mittels:
javac StrLen.java
funktioniert einwandfrei.Erstellen der Header-Datei mittels:
javah -jni StrLen
funktioniert ebenfalls problemlos.Es folgt der Quellcode der strlen.c:
#include <jni.h> #include "StrLen.h" #include <stdio.h> JNIEXPORT jint JNICALL Java_StrLen_strlen( JNIEnv *env, jclass clazz, jstring s ) { printf( "Hallo Java-Freunde!\n" ); return 0; }
Es folgt nun der Befehl zum kompilieren der c-Datei in eine .dll:
gcc -shared -I C:\Programme\Java\jdk1.6.0_03\include -I C:\Programme\Java\jdk1.6.0_03\include\win32 -o strlen.dll strlen.c
Auch hier werden keine Probleme festgestellt.
Wird nun aber die Java-Datei mittels:
java -Djava.library.path=. StrLen
ausgeführt, so erscheint folgende Fehlermeldung:Exception in thread "main" java.lang.UnsatisfiedLinkError: StrLen.strlen(Ljava/lang/String;)I
at StrLen.strlen(Native Method)
at StrLen.main(StrLen.java:10)Findet er die strlen.dll nicht?
Die sollte er finden, denn wird sie gelöscht und das Programm ausgeführt, so erscheint eine andere Fehlermeldung.Es scheint so, als wenn er also die Methode strlen nicht finden kann.
Warum nicht?
Habe ich irgendwo einen Syntaxfehler/Schreibfehler oder sonstiges
Problemlösung?Hoffe ihr erkennt mein Problem und könnt mir helfen...
MfG
-
Compilier die DLL mal so:
gcc -IC:\...\jdk1.6.0_03\include\ -IC:\...\jdk1.6.0_03\include\win32\ -shared -Wl,--add-stdcall-alias -o Name.dll Name.c
-
Alles klar, funktioniert,
herzlichen Dank,
lag also an fehlenden Parametern bei der Kompilierung...MfG