JNI Beispiel von GalileoComputing -> Problem



  • Hallo,
    ich versuche, das JNI-Beispiel von GalileoComputing anzuwenden:
    http://www.galileocomputing.de/openbook/javainsel7/javainsel_26_002.htm

    Folgender 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


Anmelden zum Antworten