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

  • Danke The User für die schnelle Antwort,
    Es ist schon klar! es läuft so wie es ist aber so wie oben steht bekommt die Methode "NULL" als Text und nicht als wert glaube ich. also mit "0" geht.

    Gruß
    Mike