2012-02-21 2 views
11

Sono un po 'bloccato con questo ... ReferenceTable overflow (max = 512), sono sicuro che ha a che fare con il Numero di riferimenti locali che vengono creati nel mio metodo nativo call ... Per aggirare il problema, ho persino provato a rimuovere i riferimenti locali dalla chiamata nativa; ma ancora non sono in grado di risolvere il problema ... Sto passando un array 2D; che è approssimativamente 1024 X 1024 ...ReferenceTable overflow (max = 512) JNI

Ecco la traccia di errore a cui mi riferisco ... Sono sicuro che il numero di Oggetti Interi creati da creare sta causando il problema per il mio caso ... come dovresti essere in grado per vedere sono creati 506 (I) oggetti ... E poi JNI colpisce il collo di bottiglia ...

/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) 

Ecco il codice che sto usando: per favore fatemi sapere che cosa è che sto facendo male?

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); 
} 

risposta

5

è necessario eliminare riferimento locale da oneDim oggetto: env->DeleteLocalRef(oneDim);.

+0

la soluzione ha aiutato me crea più oggetti ... ma probabilmente ha creato un altro problema per il mio pacchetto di applicazioni (pv.ndk) - Spero che non sono correlate .. solo dopo questo crahes VM senza alcun messaggio di errore D/vending (18272): [11] LocalAssetCache.updateOnePackage(): Nessuna informazione locale per pv.ndk – Pranav

+0

Hmm, questo è strano. Hai messo 'DeleteLocalRef()' dopo 'ReleaseIntArrayElements()', giusto? – beetoom

+0

volevo solo essere sicuro su questo, ho bisogno di mettere entrambi? attualmente sto usando solo DeleteLocalRef [perché sto colpendo il limite 512 della tabella di riferimento locale] Ero sotto impressione Ho bisogno di usare DeleteLocalRef o ReleaseIntArrayElements; ed entrambi servono allo stesso scopo in un modo diverso. – Pranav