【问题标题】:ReferenceTable overflow (max=512) JNIReferenceTable 溢出 (max=512) JNI
【发布时间】:2012-03-11 10:58:30
【问题描述】:

我对这个有点坚持...... ReferenceTable 溢出(最大 = 512),我确信它与在我的本机方法调用中创建的本地引用数有关......为了解决这个问题,我什至尝试从本机调用中删除本地引用;但我仍然无法解决问题......我正在传递一个二维数组;大约是 1024 X 1024 ...

这是我所指的错误跟踪...我确信创建的整数对象的数量会导致我的情况出现问题...因为您应该能够看到 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);
}

【问题讨论】:

    标签: android android-ndk java-native-interface


    【解决方案1】:

    您需要从oneDim 对象中删除本地引用:env-&gt;DeleteLocalRef(oneDim);

    【讨论】:

    • 该解决方案确实帮助我创建了更多对象......但可能它为我的应用程序包(pv.ndk)创建了另一个问题 - 我希望它们不相关......就在这个虚拟机崩溃之后任何错误消息 D/vending(18272): [11] LocalAssetCache.updateOnePackage(): 没有 pv.ndk 的本地信息
    • 嗯,这很奇怪。你确实把DeleteLocalRef()放在ReleaseIntArrayElements()之后,对吧?
    • 只是想确定这一点,我需要把两者都放吗?目前我只使用 DeleteLocalRef [因为我达到了本地引用表的 512 限制] 我的印象是我需要使用 DeleteLocalRef 或 ReleaseIntArrayElements;而且它们都以不同的方式服务于相同的目的。
    • 是的,两者都需要。 GetObjectArrayElement 返回带有本地引用的对象,因此您需要删除本地引用。但是只有在完成数组元素时才应该这样做。所以你应该把DeleteLocalRef(oneDim)放在ReleaseIntArrayElements(oneDim)之后。顺便说一句,您是否考虑过使用 JNI 库,例如 JNIpp
    • 在数组发布后应该使用 DeleteLocalRef 的确切记录在哪里?据此:ibm.com/developerworks/library/j-jni(参见清单 9),每次使用数组元素后都会调用 DeleteLocalRef...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2016-12-01
    • 2012-06-21
    • 2017-06-06
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多