2014-11-01 47 views
9

我想用我自己的數據集運行LibSVMAndroidClassification Android項目。它與已經提供的數據集完美地結合在一起,並且當我使用具有100行的csv(它小於原始大小的1%)時它也可以正常工作。但是當我嘗試去爲例如1000行「訓練CSV」時,我發現這個錯誤。我甚至試圖在Manifest.xml中設置android:largeHeap =「true」,但沒有任何改進。JNI錯誤(應用程序錯誤):本地參考表溢出(最大= 512)

這是我的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) 

我google了很多,但我仍然無法理解背後的原因和背後的原因。很多人在不同的情況下都面臨同樣的錯誤。什麼可以成爲解決方案的合適指針?

在此先感謝!

+7

通常的問題是,什麼是創造局部引用,而不是刪除它們(見例如http://developer.android.com/training/articles/perf-jni.html#local_and_global_references)。出於某種原因,您的本地參考表正在填充「int」和「double」。如果對象是在循環中創建的,則應該用'DeleteLocalRef'刪除它們,因爲在控制權返回到該線程中的VM之前,表不會被清空。 – fadden 2014-11-01 15:29:29

+1

是的,它幫助!現在使用DeleteLocalRef()後,問題已解決,因爲發佈功能不夠。 – 2014-11-12 16:54:25

回答

4

您最好使用DeleteLocalRef刪除以後再也不會使用的本地引用。 例如

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