2014-11-01 21 views
9

Sto tentando di eseguire il progetto Android LibSVMAndroidClassification con il mio set di dati. Funziona perfettamente con il set di dati già fornito e funziona anche quando uso il mio CSV con 100 righe (che è inferiore all'1% della dimensione originale). Ma quando provo ad andare su "Train CSV" con per esempio 1000 righe, vedo questo errore. Ho persino provato a impostare android: largeHeap = "true" in Manifest.xml ma non è stato migliorato nulla.ERRORE JNI (bug dell'app): overflow della tabella di riferimento locale (max = 512)

Questo è il mio dump 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) 

Ho cercato su Google molto, ma ancora non riesco a capire lo sfondo e la ragione dietro questo. Molte persone hanno affrontato questo stesso errore in diverse situazioni. Quale può essere un puntatore adatto alla soluzione?

Grazie in anticipo!

+7

Il solito problema è che qualcosa sta creando riferimenti locali e non cancellarli (si veda ad esempio http://developer.android.com/training/articles/perf-jni.html#local_and_global_references). Per qualche ragione la tua tabella di riferimento locale si sta riempiendo di 'int' e' double'. Se gli oggetti vengono creati in un ciclo, devono essere eliminati con 'DeleteLocalRef', poiché la tabella non viene svuotata finché il controllo non ritorna alla VM in quel thread. – fadden

+1

Sì, ha aiutato! Il problema è stato risolto ora dopo aver usato DeleteLocalRef() perché le funzioni di rilascio non erano sufficienti. –

risposta

4

è consigliabile utilizzare DeleteLocalRef per eliminare il riferimento locale che non verrà mai utilizzato in seguito. ad es.

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