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
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
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;
}
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
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
EDYCJA: Proszę zignorować mój poprzedni komentarz, powyższy kod działa. Dziękujemy! To było bardzo pomocne. – RyanCheu
EDIT2: Kod działa, ale musisz zmienić tmp w SetIntArrayRegion (...), aby wypełnić. – RyanCheu