F
FelixMK
Gast
Hallo,
ich möchte gerne aus Java eine C-Funtkion ausrufen. Das sollte mit dem Java Native Interface (JNI) eigentlich kein Problem sein.
Als Dokumentation verwende ich "Java ist auch eine Insel (2.Aufl.)" von Christian Ullenboom. Nachdem es mit meinem Testprojekt nicht geklappt hat testete ich das Beispiel aus der Dokumentation.
Das Beispiel soll eine in C geschriebene Funktion aus einer Bibliothek aufrufen, die die Länge eines Strings zurückgibt. Alle Dateien befinden sich in einem Verzeichnis namens jnitest.
Dazu folgender Java-Quellcode in der Datei StrLen.java:
Dann wird der Quellcode compiliert (Datei: StrLen.java) und eine Header-Datei erzeugt:
Die Header-Datei strlen.h.
Nun wird noch die C-Funktion geschrieben. Um es nicht zu kompliziert zu machen gibt die Funktion erst mal nur
strlen.c:
Nun soll diese Datei zu einer DLL compiliert werden, und da liegt bei mir vermutlich der Fehler:
Das setzen der Umgebungsvariablen LD_LIBRARY_PATH entfällt, da sich ja alle Dateien im selben Verzeichis befinden.
Rufe ich das Programm mit
auf wird folgendes ausgegeben:
Info:
System:
....Microsoft Windows XP
....Home Edition
....Version 2002
....Service Pack 1
Java:
....Java(TM) 2 SDK, Standard Edition
....Version 1.4.2
C-Compiler:
....MinGW GNU Compiler
ich möchte gerne aus Java eine C-Funtkion ausrufen. Das sollte mit dem Java Native Interface (JNI) eigentlich kein Problem sein.
Als Dokumentation verwende ich "Java ist auch eine Insel (2.Aufl.)" von Christian Ullenboom. Nachdem es mit meinem Testprojekt nicht geklappt hat testete ich das Beispiel aus der Dokumentation.
Das Beispiel soll eine in C geschriebene Funktion aus einer Bibliothek aufrufen, die die Länge eines Strings zurückgibt. Alle Dateien befinden sich in einem Verzeichnis namens jnitest.
Dazu folgender Java-Quellcode in der Datei StrLen.java:
Code:
public class StrLen
{
static {
System.loadLibrary("strlen");
}
public static native int strlen( String s );
public static void main( String args[] )
{
System.out.println( strlen("Sandra ist doof.") );
}
}
Dann wird der Quellcode compiliert (Datei: StrLen.java) und eine Header-Datei erzeugt:
Code:
javac -verbose StrLen.java
javah -jni -o strlen.h StrLen
Die Header-Datei strlen.h.
Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class StrLen */
#ifndef _Included_StrLen
#define _Included_StrLen
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: StrLen
* Method: strlen
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_StrLen_strlen
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
Nun wird noch die C-Funktion geschrieben. Um es nicht zu kompliziert zu machen gibt die Funktion erst mal nur
aus und gibt 0 zurück.Hallo Java-Freunde!\n
strlen.c:
Code:
#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;
}
Nun soll diese Datei zu einer DLL compiliert werden, und da liegt bei mir vermutlich der Fehler:
Code:
gcc -shared -Ic:\j2sdk1.4.2\include -Ic:\j2sdk1.4.2\include\win32 strlen.c -o strlen.dll
Das setzen der Umgebungsvariablen LD_LIBRARY_PATH entfällt, da sich ja alle Dateien im selben Verzeichis befinden.
Rufe ich das Programm mit
Code:
java StrLen
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: strlen
at StrLen.strlen(Native Method)
at StrLen.main(StrLen.java:11)
Info:
System:
....Microsoft Windows XP
....Home Edition
....Version 2002
....Service Pack 1
Java:
....Java(TM) 2 SDK, Standard Edition
....Version 1.4.2
C-Compiler:
....MinGW GNU Compiler