Estoy un poco atascado con este ... Desbordamiento de tabla de referencia (max = 512), estoy seguro que tiene que ver con el número de referencias locales que se crean en mi método nativo llame ... Para evitar el problema, incluso he tratado de eliminar las referencias locales de la llamada nativa; pero aún no puedo resolver el problema ... Paso una matriz 2D; que es aproximadamente 1024 X 1024 ...Desbordamiento de tabla de referencia (max = 512) JNI
Aquí está el rastro de error al que me refiero ... Estoy seguro de que la cantidad de objetos enteros que se crean está causando el problema en mi caso ... como debería para ver 506 (I) los objetos se crean ... Y luego JNI golpea el cuello de botella ...
/dalvikvm(9498): GC_CONCURRENT freed 1981K, 41% free 6891K/11527K, external 1625K/2137K, paused 2ms+3ms
/dalvikvm(9498): ReferenceTable overflow (max=512)
/dalvikvm(9498): Last 10 entries in JNI local reference table:
/dalvikvm(9498): 502: 0x40710920 cls=[I (4092 bytes)
/dalvikvm(9498): 503: 0x40711920 cls=[I (4092 bytes)
/dalvikvm(9498): 504: 0x40712920 cls=[I (4092 bytes)
/dalvikvm(9498): 505: 0x40713920 cls=[I (4092 bytes)
/dalvikvm(9498): 506: 0x40714920 cls=[I (4092 bytes)
/dalvikvm(9498): 507: 0x40715920 cls=[I (4092 bytes)
/dalvikvm(9498): 508: 0x40716920 cls=[I (4092 bytes)
/dalvikvm(9498): 509: 0x40717920 cls=[I (4092 bytes)
/dalvikvm(9498): 510: 0x40718920 cls=[I (4092 bytes)
/dalvikvm(9498): 511: 0x40719920 cls=[I (4092 bytes)
/dalvikvm(9498): JNI local reference table summary (512 entries):
/dalvikvm(9498): 1 of Ljava/lang/Class; 236B
/dalvikvm(9498): 1 of Ljava/lang/Class; 284B
/dalvikvm(9498): 1 of Ljava/lang/Class; 572B
/dalvikvm(9498): 2 of Ljava/lang/String; 28B (2 unique)
/dalvikvm(9498): 506 of [I 4092B (506 unique)
/dalvikvm(9498): 1 of [Ljava/lang/String; 28B
/dalvikvm(9498): Memory held directly by tracked refs is 2071728 bytes
/dalvikvm(9498): Failed adding to JNI local ref table (has 512 entries)
/dalvikvm(9498): "main" prio=5 tid=1 RUNNABLE
/dalvikvm(9498): | group="main" sCount=0 dsCount=0 obj=0x4001f198 self=0xce60
/dalvikvm(9498): | sysTid=9498 nice=0 sched=0/0 cgrp=default handle=-1345006528
/dalvikvm(9498): | schedstat=(6990020745 1042358411 1629)
/dalvikvm(9498): at pv.ndk.UcMobile.losInitialization(Native Method)
/dalvikvm(9498): at pv.ndk.NdkActivity.onCreate(NdkActivity.java:69)
/dalvikvm(9498): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
/dalvikvm(9498): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
Aquí está el código que estoy utilizando: Por favor, hágamelo saber qué es lo que estoy haciendo mal?
JNIEXPORT jboolean JNICALL Java_pv_ndk_UcMobile_losInitialization
(JNIEnv * env, jobject jobj , jint height, jint width , jobjectArray elements){
elevData = new unsigned int*[height];
for(i=0; i< height; i++) {
elevData[i] = new unsigned int[width];
jintArray oneDim=
(jintArray)env->GetObjectArrayElement(
elements, i);
jint *element=env->GetIntArrayElements(oneDim, 0);
for(j=0; j< width; j++) {
elevData[i][j]= element[j];
}
// This does not seem to be providing with the desired result
// env->DeleteLocalRef(element);
//I even tried with this approach
env->ReleaseIntArrayElements(oneDim, element , 0);
}
return losObject.Init(elevData,1,10,2,2);
}
la solución me ayudó a crear más objetos ... pero probablemente haya creado otro problema para mi paquete de aplicaciones (pv.ndk) - Espero que no estén relacionados ... justo después de este VM crahes sin ningún mensaje de error D/vending (18272): [11] LocalAssetCache.updateOnePackage(): No hay información local para pv.ndk – Pranav
Hmm, eso es extraño. Pusiste 'DeleteLocalRef()' después de 'ReleaseIntArrayElements()', ¿verdad? – beetoom
solo quería estar seguro de esto, ¿tengo que poner ambos? actualmente estoy usando solamente DeleteLocalRef [porque estoy llegando al límite de 512 de la tabla de referencia local] Estaba bajo impresión Necesito usar DeleteLocalRef o ReleaseIntArrayElements; y ambos sirven el mismo propósito de una manera diferente. – Pranav