JNI: Object mit einem byte array ans C übergeben

U

Unicate

Erfahrenes Mitglied
Threadstarter
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(_jcls, jmid);
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(byteArray, offset, size, (jbyte*)value);
// write the array onto the java object
_env->SetByteField(_jobj, getFieldId("_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?
 
U

Unicate

Erfahrenes Mitglied
Threadstarter
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.
 
Oben Unten