1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

JNI: Object mit einem byte array ans C übergeben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Unicate, 28.03.2012.

  1. Unicate, 28.03.2012 #1
    Unicate

    Unicate Threadstarter Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Hallo alle zusammen!

    Ich muss ein bytearray(C) (uint8_t[]) in ein Java object übergeben, welches ein bytearray (byte[]) als Member hat.

    Im java etwa:
    PHP:
    class foo {
        
    byte[] _array;
    }
    Im C sieht das ganze im Moment so aus:

    PHP:
    // Klassendefinition suchen
    _jcls env->FindClass("de/unicate/jnitest/foo");
    if (
    _jcls == NULL) {
        
    LOGE("Could not find class: %s\n"classPath);
        return;
    }
    // Adresse des Konstruktors der Klasse ermitteln
    jmethodID jmid env->GetMethodID(_jcls"<init>""()V");
    if (
    jmid == NULL) {
        
    LOGE("Error GetMethodID\n");
        return;
    }

    // Neues Objekt der Klasse erzeugen
    _jobj env->NewObject(_jclsjmid);
    if (
    _jobj == NULL) {
        
    LOGE("Error NewObject\n");
        return;
    }
    int size 8;
    int offset 0;
    uint8_t value[] = {0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02};
    // create a java byte array
    jbyteArray byteArray _env->NewByteArray(size);
    // fill the byte array with the value
    _env->SetByteArrayRegion(byteArrayoffsetsize, (jbyte*)value);
    // write the array onto the java object
    _env->SetByteField(_jobjgetFieldId("_array""[B"), byteArray); // <= Geht nicht so
    Problem ist hier, das das setzen der Variable "_array" nicht so funktioniert, da die Methode "SetByteField" ein jbyte und kein ganzes Array erwartet.

    Welche Methode muss ich nutzen um das ganze array setzen zu können?
     
  2. Unicate, 29.03.2012 #2
    Unicate

    Unicate Threadstarter Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Problem gelößt!

    Die einzige Idee, dir mir noch kam, war das ich mir das bytearray als Feld zurückgeben lasse (pointer auf das javabytearray) und dieses Feld dann direkt im C beschreibe.

    Nachteil hier, wenn die Membervariable mit null initialisiert wurde, muss zuerst ein Callback (C=>Java) aufgerufen werden, in dem der Member allokiert wird. Wird das nicht gemacht liefert die Methode "GetByteArrayRegion" null zurück.
     

Diese Seite empfehlen