参考表溢出(最大值=512) JNI
我对这个有点卡住了...... 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);
}
I am a little stuck with this one...
ReferenceTable overflow (max=512), I am sure it has to do with the Number of Local References getting created in my native method call... To work around the issue I have even tried to remove the local references from the native call; but still I am unable to solve the problem... I am passing a 2D Array; which is approaximately 1024 X 1024 ...
Here is the error trace I am referring to ... I am sure that number of Integer Objects getting created is causing the issue for my case ... as you should be able to see 506(I) Objects are created... And then JNI hits the bottleneck...
/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)
Here is the code I am using :
Please let me know what is it that I am doing wrong ?
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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要从
oneDim
对象中删除本地引用:env->DeleteLocalRef(oneDim);
。You need to delete local reference from
oneDim
object:env->DeleteLocalRef(oneDim);
.