【问题标题】:For loop causes: VM aborting - Fatal signal 6 (SIGABRT) code=-6For 循环原因:VM 中止 - 致命信号 6 (SIGABRT) 代码=-6
【发布时间】:2015-07-19 02:17:06
【问题描述】:

我不知道为什么会抛出这个错误。仅当使用循环时,应用程序才会崩溃。我正在将 ArrayList > 导入 ndk。我无法使用 opencv 在 ndk 中打开视频文件进行视频处理,因此我在 java 端获得了 javacv 的位置(我一般是 android 新手,我找不到更优雅的方法)

外部数组的长度为 10(最大 50),内部数组的长度可变(200 - 500)

我最初认为这可能是由于 android 中的内存限制。我现在相信这不可能,因为我运行了一个空循环迭代 10 次。它给了我同样的错误。我不明白这个错误是什么意思。

我是安卓新手。有人可以帮我吗?这应该怎么办?我很感激任何和所有的建议。提前致谢!

代码:

    // 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);


}

错误:

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)

【问题讨论】:

  • "VM aborting" 表示 VM 已故意自行崩溃。如果您在 logcat 输出中再往前看一点,您会找到解释。

标签: java android opencv android-ndk


【解决方案1】:

我不是来自 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

【讨论】:

  • 谢谢,我去看看如何调试ndk!
猜你喜欢
  • 2014-04-29
  • 2015-03-29
  • 2016-01-05
  • 2014-06-25
  • 2014-12-21
  • 2017-03-07
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多