web-dev-qa-db-ja.com

JNIエラー(アプリのバグ):ローカル参照テーブルのオーバーフロー(最大= 512)

LibSVMAndroidClassification Androidプロジェクトを自分のデータセットで実行しようとしています。すでに提供されているデータセットで完全に正常に動作し、csvを使用しても正常に動作します。 100行(元のサイズの1%未満)しかし、たとえば1000行で「TrainCSV」を実行しようとすると、このエラーが表示されます。マニフェストでAndroid:largeHeap = "true"を設定しようとしました。 .xmlですが、何も改善されていません。

これは私のlogcatダンプです。

10-31 17:49:06.745: E/dalvikvm(2008): JNI ERROR (app bug): local reference table overflow (max=512)
10-31 17:49:06.745: W/dalvikvm(2008): JNI local reference table (0x754057e0) dump:
10-31 17:49:06.745: W/dalvikvm(2008): Last 10 entries (of 512):
10-31 17:49:06.745: W/dalvikvm(2008): 511: 0x42d900b0 double
10-31 17:49:06.745: W/dalvikvm(2008): 510: 0x42a19698 int
10-31 17:49:06.745: W/dalvikvm(2008): 509: 0x42d8ff78 double
10-31 17:49:06.745: W/dalvikvm(2008): 508: 0x42a195f0 int
10-31 17:49:06.745: W/dalvikvm(2008): 507: 0x42d8fe40 double
10-31 17:49:06.745: W/dalvikvm(2008): 506: 0x42a19548 int
10-31 17:49:06.745: W/dalvikvm(2008): 505: 0x42d8fd08 double
10-31 17:49:06.745: W/dalvikvm(2008): 504: 0x42a194a0 int
10-31 17:49:06.745: W/dalvikvm(2008): 503: 0x42d8fbd0 double
10-31 17:49:06.745: W/dalvikvm(2008): 502: 0x42a193f8 int
10-31 17:49:06.745: W/dalvikvm(2008): Summary:
10-31 17:49:06.745: W/dalvikvm(2008): 5 of Java.lang.Class (4 unique instances)
10-31 17:49:06.745: W/dalvikvm(2008): 3 of Java.lang.String (3 unique instances)
10-31 17:49:06.745: W/dalvikvm(2008): 249 of int (249 unique instances)
10-31 17:49:06.745: W/dalvikvm(2008): 1 of int
10-31 17:49:06.745: W/dalvikvm(2008): 250 of double (250 unique instances)
10-31 17:49:06.745: W/dalvikvm(2008): 1 of Java.lang.String
10-31 17:49:06.745: W/dalvikvm(2008): 1 of int[]
10-31 17:49:06.745: W/dalvikvm(2008): 1 of edu.sinica.citi.mac.Android.actclassification.ActClassificationActivity
10-31 17:49:06.745: W/dalvikvm(2008): 1 of double[]
10-31 17:49:06.745: E/dalvikvm(2008): Failed adding to JNI local ref table (has 512 entries)
10-31 17:49:06.745: I/dalvikvm(2008): "main" prio=5 tid=1 RUNNABLE
10-31 17:49:06.745: I/dalvikvm(2008): | group="main" sCount=0 dsCount=0 obj=0x42027710 self=0x420115f0
10-31 17:49:06.745: I/dalvikvm(2008): | sysTid=2008 Nice=0 sched=0/0 cgrp=apps handle=1074106620
10-31 17:49:06.745: I/dalvikvm(2008): | state=R schedstat=( 774483646 137982240 4930 ) utm=59 stm=18 core=1
10-31 17:49:06.745: I/dalvikvm(2008): at edu.sinica.citi.mac.Android.actclassification.ActClassificationActivity.svmtrain(Native Method)
10-31 17:49:06.745: I/dalvikvm(2008): at edu.sinica.citi.mac.Android.actclassification.ActClassificationActivity.train_csv(ActClassificationActivity.Java:329)
10-31 17:49:06.745: I/dalvikvm(2008): at edu.sinica.citi.mac.Android.actclassification.ActClassificationActivity$2.onClick(ActClassificationActivity.Java:125)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.view.View.performClick(View.Java:4249)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.view.View$PerformClick.run(View.Java:17764)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.os.Handler.handleCallback(Handler.Java:730)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.os.Handler.dispatchMessage(Handler.Java:92)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.os.Looper.loop(Looper.Java:137)
10-31 17:49:06.745: I/dalvikvm(2008): at Android.app.ActivityThread.main(ActivityThread.Java:5137)
10-31 17:49:06.745: I/dalvikvm(2008): at Java.lang.reflect.Method.invokeNative(Native Method)
10-31 17:49:06.745: I/dalvikvm(2008): at Java.lang.reflect.Method.invoke(Method.Java:525)
10-31 17:49:06.745: I/dalvikvm(2008): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:752)
10-31 17:49:06.745: I/dalvikvm(2008): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:568)
10-31 17:49:06.745: I/dalvikvm(2008): at miui.dexspy.DexspyInstaller.main(DexspyInstaller.Java:171)
10-31 17:49:06.745: I/dalvikvm(2008): at dalvik.system.NativeStart.main(Native Method)
10-31 17:49:06.745: E/dalvikvm(2008): VM aborting
10-31 17:49:06.745: A/libc(2008): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 2008 (tclassification)

私はたくさんグーグルで検索しましたが、それでもその背景と理由を理解することができません。多くの人々は、さまざまな状況でこれと同じエラーに直面しています。ソリューションへの適切なポインタは何でしょうか?

前もって感謝します !

11
Wahib Ul Haq

deleteLocalRefを使用して、後で使用されないローカル参照を削除することをお勧めします。例えば.

for (int i = 0; i < 512; i++)
{
        jobject obj = env->GetObjectArrayElement(array, i);
        //your code here    
        env->DeleteLocalRef(obj);   
}
5
zhuzhenlei