Java String in C char über JNI - Java native interface -

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Java String in C char über JNI - Java native interface -

    Hallo,
    ich bin neu hier im Forum und auch mit C und hoffe, dass meine Frage beantwortet wird.

    und zwar ch versuche diese C-Methode von java aus aufzurufen:

    int
    startup(
    const char *addr,
    const char *listen_port,
    const char *strap_addr,
    const char *strap_port
    );

    //*********************************************************
    also in Java :
    static{
    System.loadLibrary("method_aufruf_testlib");
    }
    public native int j_startup(
    String addr,
    String listen_port,
    String bootstrap_addr,
    String bootstrap_port
    );
    public static void main(String[] args) {

    j_method_aufruf_test call_method = new j_method_aufruf_test();
    String j_string = "NULL";

    call_method.j_startup(j_string, j_string, j_string, j_string);


    //*********************************************************
    in C:

    JNIEXPORT jint JNICALL Java_joss_1method_1aufruf_1test_j_1startup
    (JNIEnv *env, jobject jobj, jstring j_addr,
    jstring j_listen_port,
    jstring j_bootstrap_addr,
    jstring j_bootstrap_port)
    {

    // konvertiere Java-String in C-String
    const char *addr = (*env)->GetStringUTFChars(env, j_addr, 0);
    const char *listen_port = (*env)->GetStringUTFChars(env, j_listen_port, 0);
    const char *bootstrap_addr = (*env)->GetStringUTFChars(env, j_bootstrap_addr, 0);
    const char *bootstrap_port = (*env)->GetStringUTFChars(env, j_bootstrap_port, 0);


    printf("addr s = %s\n", addr);
    printf("addr c = %c\n", addr);
    printf("*addr c = %c\n\n", *addr);

    printf("vor startup \n\n\n");

    int ruekgabe = startup( addr, listen_port, bootstrap_addr, bootstrap_port);

    printf("nach startup \n\n\n");

    return ruekgabe;
    }
    //*********************************************************

    Ausgabe:
    @linux-vltm:~/workspacej/malloctest/bin> java joss_method_aufruf_test



    addr s = NULL
    addr c = �
    *addr c = N

    vor oss_startup


    @linux-vltm:~/workspacej/malloctest/bin>
    //*********************************************************
    Ich glaube die Methode in c [int ruekgabe = startup( addr, listen_port, bootstrap_addr, bootstrap_port);]
    bekommt nicht das was in java übergeben wurde [in dem Fall NULL, es war String j_string = "NULL"; ]

    was mache ich falsch?

    PS: es funktioniert einwandfrei z.B wenn ich diese Variablen in C initialisiere (also nicht durch konvertieren von Java-String):


    char *addr = NULL;
    char *listen_port = NULL;
    char *bootstrap_addr = NULL;
    char *bootstrap_port = NULL;

    Aber mein Ziel ist es , von java aus die Methode so aufrufen zu können:
    call_method. j_startup(
    String addr,
    String listen_port,
    String bootstrap_addr,
    String bootstrap_port
    );

    Ich danke im Voraus

    Gruß
    Mike
  • Ich glaube dein C-Programm ist falsch. Ich habe im Internet das Beispiel gefunden:

    Quellcode

    1. JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
    2. (JNIEnv * env, jobject jobj, jstring name) {
    3. caddr_t m;
    4. jbyteArray jb;
    5. struct stat finfo;
    6. jboolean iscopy;
    7. const jchar *mfile = (*env)->GetStringChars(env,
    8. name, &iscopy);
    9. //...
    10. (*env)->ReleaseStringChars(env, name, mfile);

    Du verwendest "char" wärend im Beispiel "jchar" verwendet wird.
    Die Methode ReleaseStringChars führst du nicht aus!
    iscopy ist ein Boolean-Wert. Manüberreicht einen Pointer dieses Boolean an die GetStringChars-Funktion, damit diese GetStringChars-Funktion den jboolean einen Wert gibt. Danach kannst du schauen ob der jboolean true oder false ist. Du dagegen übereichst 0. Die GetStringChars-Funktion denkt nun das sei der Pointer und schreibt mit etwas Pech den Boolean-Wert an die Adresse 0 in deinem Speicher. Eigentlich sollte das krachen. Wenn es durch läuft, um so schlimmer.

    Und hier noch die Quell-URL:
    java.sun.com/developer/onlineT…ng/JDCBook/jnistring.html