En función JNI cuando cambio de un arreglo en el lugar que se transmite de código Java de la matriz no modifica

Igor:

Estoy pasando un array int de Java a método nativo. Luego, dentro de la función JNI creé un puntero a int matriz con GetIntArrayElements () y pasar como argumento * isCopy JNI_FALSE. Se supone que esto no va a crear una copia de la matriz original y pude modificar matriz en su lugar. Luego uso ReleaseIntArrayElements () y pase como argumento de modo JNI_ABORT a tampón solo relese. Pero eso no funcionó.

A partir de la documentación JNI:

  • Modo 0: copiar de nuevo el contenido y liberar el búfer de elems
  • Modo JNI_COMMIT: copia el contenido pero no liberar el búfer de elems
  • Modo JNI_ABORT: liberar el buffer sin copiar de vuelta los posibles cambios

Que cuando traté de modo de uso "0" en ReleaseIntArrayElements () que funcionó a la perfección. Pero no entiendo por qué causa no he creado una copia de la matriz original y el modo "0" es copiar el contenido.

Supongo que siempre JNI crear una copia de la matriz original. Pero entonces * argumento isCopy en GetIntArrayElements () pierden su sentido. Así que lo que realmente pasa con esto?

ESTA ES MI JNI fucntion

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;
}
Algunos Nombre:

Usted mal uso del jboolean *isCopy. Es un parámetro de salida debe examinar después de la llamada real a env->GetIntArrayElements(tbl, isCopy);. Si devuelve JNI_FALSEentonces no se realiza la copia.

Esto es necesario ya GC puede mover los elementos de un lugar a otro de manera imprevisible y siempre se debe copiar los cambios de nuevo a la matriz original de Java. Porque nunca se sabe la ubicación de memoria de la matriz java real.

Si no quieres se hace la copia que probablemente en busca de una criticalversión del método. Esto es lo que dice la documentación JNI:

Estas restricciones hacen que sea más probable que el código nativo> obtendrá una versión no copiada de la matriz, incluso si la máquina virtual> no soporta fijando

Esto no quiere decir que la JVM desactivar la recolección de basura, siempre y cuando usted está sosteniendo una sección crítica, aunque es probable que lo hagan.

Emp. Mía:

Por ejemplo, una máquina virtual puede temporalmente la recogida de basura desactivar cuando el código nativo está sosteniendo un puntero a una matriz obtenida a travésGetPrimitiveArrayCritical

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=223190&siteId=1
Recomendado
Clasificación