2009-10-22 13 views
102

Próbuję użyć Android NDK.Jak zwrócić tablicę z JNI do Java?

Czy istnieje sposób na zwrócenie tablicy (w moim przypadku int[]) utworzonej w JNI na Java? Jeśli tak, proszę podać krótki przykład funkcji JNI, która by to zrobiła.

-Dzięki

Odpowiedz

92

Jeśli zbadała dokumentację i nadal masz pytania, które powinny być częścią początkowego pytania. W tym przypadku funkcja JNI w przykładzie tworzy pewną liczbę tablic. Zewnętrzna tablica składa się z tablicy "Object" tworzącej z funkcją JNI NewObjectArray(). Z perspektywy JNI, to wszystko jest tablicą dwuwymiarową, tablicą obiektów zawierającą wiele innych wewnętrznych tablic.

Poniższa pętla tworzy wewnętrzne macierze typu int [] przy użyciu funkcji JNI NewIntArray(). Jeśli chcesz tylko zwrócić jednowymiarową tablicę int, to funkcja, której chcesz użyć do utworzenia wartości zwracanej, jest funkcją NewIntArray(). Jeśli chcesz utworzyć jednowymiarową tablicę Ciągów, użyjesz funkcji NewObjectArray(), ale z innym parametrem dla klasy.

Skoro chcesz powrócić int tablicę, a następnie kod będzie wyglądać następująco:

JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size) 
{ 
jintArray result; 
result = (*env)->NewIntArray(env, size); 
if (result == NULL) { 
    return NULL; /* out of memory error thrown */ 
} 
int i; 
// fill a temp structure to use to populate the java int array 
jint fill[size]; 
for (i = 0; i < size; i++) { 
    fill[i] = 0; // put whatever logic you want to populate the values here. 
} 
// move from the temp structure to the java structure 
(*env)->SetIntArrayRegion(env, result, 0, size, fill); 
return result; 
} 
+0

Tak, zrobiłem to już. Miałem problemy ze zrozumieniem przykładu, który był związany z moim problemem (ostatnim), i zastanawiałem się, czy ktoś nie miałby nic przeciwko wytłumaczeniu prostszego przykładu z właśnie zwracanym int []. – RyanCheu

+0

EDYCJA: Proszę zignorować mój poprzedni komentarz, powyższy kod działa. Dziękujemy! To było bardzo pomocne. – RyanCheu

+3

EDIT2: Kod działa, ale musisz zmienić tmp w SetIntArrayRegion (...), aby wypełnić. – RyanCheu

30

jeśli ktoś chciałby wiedzieć, jak wrócić string [] tablicy:

java Kod

private native String[] data(); 

rodzimy eksport

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject); 

kod natywny

JNIEXPORT jobjectArray JNICALL 
       Java_example_data 
    (JNIEnv *env, jobject jobj){ 

    jobjectArray ret; 
    int i; 

    char *message[5]= {"first", 
         "second", 
         "third", 
         "fourth", 
         "fifth"}; 

    ret= (jobjectArray)env->NewObjectArray(5, 
     env->FindClass("java/lang/String"), 
     env->NewStringUTF("")); 

    for(i=0;i<5;i++) { 
     env->SetObjectArrayElement( 
     ret,i,env->NewStringUTF(message[i])); 
    } 
    return(ret); 
    } 

z linku: http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java