2014-10-28 10 views
5

Potrzebuję uzyskać tablicę bajtów od jni do Javy. Ex: Mam bajt bajt array [] = {1,2,3,4,5,6}Zwróć tablicę bajtów w Androidzie jni?

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray (JNIEnv *env, jobject obj) { 
    jbyte[] a = {1,2,3,4,5,6}; 
    return a; 

}

nie wiem jak zwracają tablicę bajtów z JNI .

Czy ktoś może mi pomóc? Proszę!

Odpowiedz

13

W języku Java tablica jest obiektem. Aby przekazać tablicę bajtów z C lub C++ do java, musisz utworzyć instancję jbyteArray i zwrócić ją. Zamiast tablicy C. Aby rozwiązać ten, patrz poniższy kod:

JNIEXPORT jbyteArray JNICALL Java_Test_returnArray 
    (JNIEnv *env, jobject This) 
{ 
     jbyte a[] = {1,2,3,4,5,6}; 
     jbyteArray ret = env->NewByteArray(6); 
     env->SetByteArrayRegion (ret, 0, 6, a); 
     return ret; 
} 

oparte na tej link

+0

nie działa, jakieś rozwiązanie? –

+0

Czy otrzymujesz wyjątek? Jaka jest wartość zwracana po stronie Java? – TheDutchDevil

+0

@DungQuang Proszę sprawdzić kod teraz, miałem trochę więcej czasu na obejrzenie go i naprawiłem raczej kłopotliwy błąd kompilatora. Zmieniony kod działa dla mnie i daje mi tablicę bajtów po stronie Java z liczbą sześciu. – TheDutchDevil

2

lubię to i to działa

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray(JNIEnv *env, jobject obj) { 
    jbyte byteUrl[] = {1,2,3,3,4}; 
    int sizeByteUrl = 5; 

    jbyteArray data = (*env)->NewByteArray(env, sizeByteUrl); 
    if (data == NULL) { 
     return NULL; // out of memory error thrown 
    } 

    // creat bytes from byteUrl 
    jbyte *bytes = (*env)->GetByteArrayElements(env, data, 0); 
    int i; 
    for (i = 0; i < sizeByteUrl; i++) { 
     bytes[i] = byteUrl[i]; 
    } 

    // move from the temp structure to the java structure 
    (*env)->SetByteArrayRegion(env, data, 0, sizeByteUrl, bytes); 

    return data; 
}