Я передаю массив int из Java в нативный метод.Затем в функции JNI я создал указатель на массив int с помощью GetIntArrayElements () и передал в качестве аргумента * isCopy JNI_FALSE.Я предположил, что это не создаст копию исходного массива, и я мог бы изменить массив на месте.Затем я использую ReleaseIntArrayElements () и передаю в качестве аргумента режима JNI_ABORT, чтобы просто освободить буфер.Но это не сработало.
Из документации JNI:
- mode 0: скопировать обратно содержимое и освободить буфер elems
- mode JNI_COMMIT: скопировать обратносодержимое, но не освобождайте буфер elems
- режим JNI_ABORT: освобождайте буфер без копирования возможных изменений
Это при попытке использовать режим "0" в ReleaseIntArrayElements (), чтоработал отлично.Но я не понимаю, почему я не создал копию исходного массива, а режим «0» копирует содержимое.
Я полагаю, что JNI всегда создает копию исходного массива.Но тогда аргумент * isCopy в GetIntArrayElements () теряет смысл.Так что же на самом деле происходит с этим?
ЭТО МОЯ ФУНКЦИЯ ДЖНИ
extern "C" JNIEXPORT jdouble JNICALL
Java_my_own_package_MainActivity_myFunction(
JNIEnv *env,
jobject /* this */, jintArray tbl) {
jint *tblptr = env->GetIntArrayElements(tbl, JNI_FALSE);
tblptr[0] = 0; //in-place change
env->ReleaseIntArrayElements(tb1, tblptr, JNI_ABORT);
return 0;
}