2012-02-21 11 views
11

私はちょっとこのことに固執しています... ReferenceTableオーバーフロー(最大= 512)、私はそれがローカル参照の数が自分のネイティブメソッドで作成されていると確信していますこの問題を回避するために、ネイティブ呼び出しからローカル参照を削除しようとしました。しかし、私はまだ問題を解決することができません...私は2D配列を渡しています。約1024 x 1024 ...ReferenceTableオーバーフロー(最大= 512)JNI

ここで私が言及しているエラートレースです...私は、作成された整数オブジェクトの数が私の場合の問題を引き起こしていると確信しています...あなたができるはずです 私はそれは私が間違っているのことが何であるかをお知らせください:506(I)のオブジェクトが作成された参照...そしてJNIがボトルネックにヒットする...

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

ここで私が使用していますコードはありますか?

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

答えて

5

あなたはoneDimオブジェクトからローカル参照を削除する必要があります:env->DeleteLocalRef(oneDim);

+0

解決策はもっと多くのオブジェクトを作成するのに役立ちましたが、おそらく私のアプリケーションパッケージ(pv.ndk)に別の問題が生じました - このVMの直後にエラーメッセージなしで関連していないことを祈っています D/vending(18272):[11] LocalAssetCache.updateOnePackage():pv.ndkのローカル情報がありません – Pranav

+0

Hmm、thats strange。あなたは 'ReleaseIntArrayElements()'の後に 'DeleteLocalRef()'を入れましたか? – beetoom

+0

これを確認したかっただけですが、両方を入れる必要がありますか?現在のところ、私はDeleteLocalRefだけを使用しています[原因はローカル参照テーブルの512制限に当てはまります] 私は、DeleteLocalRefまたはReleaseIntArrayElementsのいずれかを使用する必要があるという印象を受けました。彼らはどちらも同じ目的を別の方法で提供しています。 – Pranav

関連する問題