2015-05-08 2 views
1

Я не знаю, почему эта ошибка возникает. Только при использовании цикла происходит сбой приложения. Я импортирую ArrayList < ArrayList < Point>> в ndk. Я не могу открыть видеофайлы в ndk с opencv для видеообработки, поэтому я получаю позиции с javacv на стороне java (я новичок в Android и вообще не нашел более элегантный метод)Для причин цикла: прерывание VM - фатальный сигнал 6 (SIGABRT) code = -6

Внешние массив имеет длину 10 (макс. 50), а внутренняя имеет разную длину (200 - 500)

Первоначально я думал, что это связано с ограничениями памяти в Android. Теперь я верю, что этого не может быть, потому что я пробежал пустую петлю, повторяя ее 10 раз. Это дает мне ту же ошибку. Я не понимаю, что означает эта ошибка.

Я новичок в android. Кто-нибудь может мне помочь? Как это следует делать? Я благодарен за любые предложения. Заранее спасибо!

CODE:

// Class totd to get obj arraylist 
    jclass totd = env -> FindClass ("java/util/ArrayList"); 

    //Methods in totd 
    jmethodID totd_get = env-> GetMethodID (totd, "get", "(I)Ljava/lang/Object;"); 
    jmethodID totd_size = env-> GetMethodID (totd, "size", "()I"); 

    //Get length of ArrayList 

jint totd_len = env-> CallIntMethod (totdat,totd_size); 
//start loop for each frame process data: 
jint i; 
vector<vector<Point> > totalpnts; 
for (i=0;i<=totd_len;i++){ 

    //Get postion data for current frame 
    jobject fd = env-> CallObjectMethod (totdat,totd_get,i); 
    jclass curd = env-> FindClass ("java/util/ArrayList"); 
    //Get methods of inner array 
    jmethodID curd_get = env-> GetMethodID (curd, "get", "(I)Ljava/lang/Object;"); 
    jmethodID curd_size = env-> GetMethodID (curd, "size", "()I"); 
    //Get no. of objects found 
    jint objcnt = env-> CallIntMethod (fd,curd_size); 
    //Extract data from point 
    jlong j = 0; 
    vector<Point> framepnts; 
    //for(j = 0; j <= objcnt ; j++){ 
     //Id objlist 
     jobject ptxy = env-> CallObjectMethod (fd,curd_get,j); 
     jclass pnt = env-> GetObjectClass(ptxy); 
     jmethodID constr = env->GetMethodID(pnt, "<init>", "(II)V"); 
     jfieldID fix = env->GetFieldID(pnt, "x", "I"); 
     jfieldID fiy = env->GetFieldID(pnt, "y", "I"); 

     Point xy; 
     xy.x = env-> GetIntField(ptxy,fix); 
     xy.y = env-> GetIntField(ptxy,fiy); 
     framepnts.push_back(xy); 

    //} 


    totalpnts.push_back(framepnts); 


} 

ERROR:

05-08 13:30:38.593: E/dalvikvm(17064): VM aborting 
05-08 13:30:38.595: A/libc(17064): Fatal signal 6 (SIGABRT) at 0x000042a8 (code=-6), thread 17064 (st.trackerproto) 
+0

«Отмена VM» означает, что виртуальная машина сознательно разбилась сама. Если вы посмотрите немного дальше на выход logcat, вы найдете объяснение. – fadden

ответ

0

Я не от мира NDK/C++, но I know that debugging in NDK world is a complicated task. С java-стороны вы всегда будете получать Fatal signal N (SIGABRT) (независимо от того, что происходит на уровне NDK), что означает, что в вашем коде на C++ имеется некоторая ошибка. Но вы не знаете, какая это была ошибка (однако значение N может отличаться от 6 или 11) со времени его Java, и он не может знать, почему. Вы думаете, что цикл является проблемой, но вы не знаете точно, возможно, это происходит после цикла или до или внутри. Это просто что-то не так с вашим кодом на C++.
Также обратитесь к Debugging Android NDK native apps

+0

Спасибо, я посмотрю, как отлаживать ndk! –

Смежные вопросы