ReferenceTable溢出(最大值= 512)JNI [英] ReferenceTable overflow (max=512) JNI
问题描述
我有点卡住这一个... ReferenceTable溢出(最大值= 512),我相信它有跟我的本地方法调用入门创建...要解决此问题,我甚至试图删除从本地呼叫本地引用本地引用的数量;但还是我无法来解决这个问题......我传递一个二维数组;这是approaximately 1024×1024 ...
下面是错误跟踪我指的是...我相信,一些Integer对象的入门创建导致了问题我的情况......你应该可以看到被创建506(I)的对象。 ..然后JNI碰到瓶颈...
/ dalvikvm(9498):GC_CONCURRENT释放1981K,41%免费6891K / 11527K,外部1625K / 2137K,暂停2MS + 3ms的
/ dalvikvm(9498):ReferenceTable溢出(最大值= 512)
/ dalvikvm(9498):在JNI本地参照表最后10项:
/ dalvikvm(9498):502:0x40710920 CLS = I(4092字节)
/ dalvikvm(9498):503:0x40711920 CLS = I(4092字节)
/ dalvikvm(9498):504:0x40712920 CLS = I(4092字节)
/ dalvikvm(9498):505:0x40713920 CLS = I(4092字节)
/ dalvikvm(9498):506:0x40714920 CLS = I(4092字节)
/ dalvikvm(9498):507:0x40715920 CLS = I(4092字节)
/ dalvikvm(9498):508:0x40716920 CLS = I(4092字节)
/ dalvikvm(9498):509:0x40717920 CLS = I(4092字节)
/ dalvikvm(9498):510:0x40718920 CLS = I(4092字节)
/ dalvikvm(9498):511:0x40719920 CLS = I(4092字节)
/ dalvikvm(9498):JNI本地参照表摘要(512项):
/ dalvikvm(9498):1 Ljava /朗/班; 236B
/ dalvikvm(9498):1 Ljava /朗/班; 284B
/ dalvikvm(9498):1 Ljava /朗/班; 572B
/ dalvikvm(9498):2 Ljava /朗/字符串; 28B(2唯一的)
/ dalvikvm(9498):506 [我4092B(506独有)
/ dalvikvm(9498):1 [Ljava /朗/字符串; 28B
/ dalvikvm(9498):直接追踪裁判举办内存2071728字节
/ dalvikvm(9498):无法增加JNI本地参考表(有512项)
/ dalvikvm(9498):主要的PRIO = 5 TID = 1 RUNNABLE
/ dalvikvm(9498)|组=主SCOUNT = 0 dsCount = 0的obj = 0x4001f198自我= 0xce60
/ dalvikvm(9498)| sysTid = 9498漂亮= 0 sched的= 0/0 CGRP =默认的手柄= -1345006528
/ dalvikvm(9498)| schedstat =(6990020745 1042358411 1629)
/ dalvikvm(9498):在pv.ndk.UcMobile.losInitialization(本机方法)
/ dalvikvm(9498):在pv.ndk.NdkActivity.onCreate(NdkActivity.java:69)
/ dalvikvm(9498):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
/ dalvikvm(9498):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
下面是code我使用: 请让我知道它是什么,我做错了什么?
JNIEXPORT jboolean JNICALL Java_pv_ndk_UcMobile_losInitialization
(JNIEnv的* ENV,jobject jobj,jint高度,jint宽度,jobjectArray元素){
elevData =新的无符号整型* [高];
对于(i = 0; I<高度;我++){
elevData [我] =新的无符号整型宽度]
jintArray oneDim =
(jintArray)ENV-> GetObjectArrayElement(
元素,I);
jint *元素= ENV-> GetIntArrayElements(oneDim,0);
为(J = 0; J<宽度; J ++){
elevData [I] [J] =元素[J]。
}
//似乎这不被提供与所希望的结果
// ENV-> DeleteLocalRef(元);
//我甚至尝试这种方法
ENV-> ReleaseIntArrayElements(oneDim,元素,0);
}
返回losObject.Init(elevData,1,10,2,2);
}
您需要删除 oneDim
对象的局部引用: ENV-> DeleteLocalRef(oneDim);
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);
}
You need to delete local reference from oneDim
object: env->DeleteLocalRef(oneDim);
.
这篇关于ReferenceTable溢出(最大值= 512)JNI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!