Java 完成MatOfRect时SIGSEGV(GC时)

Java 完成MatOfRect时SIGSEGV(GC时),java,android,opencv,segmentation-fault,Java,Android,Opencv,Segmentation Fault,我在Nexus5上使用OpenCV4AndroidV.2.4.9和Android4.4.4股票rom 我使用这段代码运行haar cascade人脸检测: public Rect getFaceFromCascade(){ // cascade! woohoo if (mFrontCascade != null) { int height = mWorkingFrame.rows(); int faceSize = Math.round(heigh

我在Nexus5上使用OpenCV4AndroidV.2.4.9和Android4.4.4股票rom

我使用这段代码运行haar cascade人脸检测:

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)终结器中调用release

当我的类死亡时,mFaceList具有以下标题:

Mat [ 1*1*CV_32SC4, isCont=true, isSubmat=false, nativeObj=0x713cdad8, dataAddr=0x751badf0 ]
Mat [ 1964813884*1*CV_32SC(455), isCont=false, isSubmat=true, nativeObj=0x751ad8bc, dataAddr=0x751cae60 ]
在mFaceList的finalize方法中,它具有以下标题:

Mat [ 1*1*CV_32SC4, isCont=true, isSubmat=false, nativeObj=0x713cdad8, dataAddr=0x751badf0 ]
Mat [ 1964813884*1*CV_32SC(455), isCont=false, isSubmat=true, nativeObj=0x751ad8bc, dataAddr=0x751cae60 ]
这就是SIGSEGV发生的时候。你知道什么会把头球弄得这么乱吗?或者为什么会这样?我在代码中没有任何其他关于这个MatOfRect的引用


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

好的,我已经设法解决了

问题是我处于一个不同的矩阵中,我已经从C++代码中通过了。从jni返回矩阵地址时,我必须使用:

Mat ret = getSomeMatrix();
return (jlong) new Mat(ret);
因为java构造函数Mat(long addr)没有向矩阵的计数器添加引用,但是终结器确实删除了一个引用