最终确定MatOfRect时的SIGSEGV(同时GC)

时间:2014-08-10 12:29:14

标签: java android opencv sigsegv

我在Nexus 5上使用OpenCV4Android v.2.4.9和android 4.4.4 stock rom。

我使用这段代码来运行haar cascade face detection:

public Rect getFaceFromCascade(){
    // cascade! woohoo
    if (mFrontCascade != null) {
        int height = mWorkingFrame.rows();
        int faceSize = Math.round(height * mMinFaceSize);

        mFrontCascade.detectMultiScale(mWorkingFrame, mFaceList, 
                        1.1, 2, 2 , new Size(faceSize, faceSize), new Size());
    }

    Rect[] facesArray = mFaceList.toArray();

    if (facesArray.length == 0){
        //cascade couldn't find any face
        return null;
    }

    return facesArray[0];
}

mFaceList是一个MatOfRect,我在初始化类时创建一次。

当班级去世时,我不会对mFaceList做任何事情(虽然我也试过发布它并且没有帮助),并把它留给垃圾收集器,但当GC随后出现,我得到一个SIGSEGV。深入调查后,我发现问题是在MatOfRect(Mat)终结器中调用释放时。

当我的班级去世时,mFaceList有以下标题:

Mat [ 1*1*CV_32SC4, isCont=true, isSubmat=false, nativeObj=0x713cdad8, dataAddr=0x751badf0 ]

并且在mFaceList的finalize方法中它有以下标题:

Mat [ 1964813884*1*CV_32SC(455), isCont=false, isSubmat=true, nativeObj=0x751ad8bc, dataAddr=0x751cae60 ]

发生SIGSEGV时的情况。任何想法什么可以弄乱这样的标题?或者为什么会这样?我在代码中的任何地方都没有任何其他MatOfRect的引用。

任何帮助将不胜感激。维拉德

1 个答案:

答案 0 :(得分:-1)

好的,我设法解决了它。

问题是我在一个不同的矩阵中,我已经从c ++代码中传递出来了。从jni返回矩阵地址时,我不得不使用:

Mat ret = getSomeMatrix();
return (jlong) new Mat(ret);

因为java构造函数Mat(long addr)没有添加对矩阵计数器的引用,但终结器确实删除了一个引用。