我正在开发一个项目,我在 native 代码的堆上分配了一个 Mat(应某些 Java 代码的请求),如下所示:
Mat* mat = new Mat(height, width, type, pointer_to_some_native_data_buffer);
然后我在 Java 中创建一个 Mat 对象,并使用从 native 代码返回的指针将其指向该 native Mat:Mat javaHandleToNativeMat = new Mat(pointerFromNativeCode);
在从 Java 端对其进行一些处理后,我调用一个本地方法来释放开始时分配的 Mat:delete (Mat*) ptr;
我的问题是,当 GC 在指向 native Mat 的 Java Mat 上运行终结器方法时, native 内存是否会损坏?终结器代码如下:
@Override
protected void finalize() throws Throwable {
n_delete(nativeObj);
super.finalize();
}
请注意,它调用了 n_delete(nativeObj)
.我想知道这是否可能是一个问题,因为我之前在 native 代码中删除了该对象。如果是问题,解决问题的最佳方法是什么?我应该直接打电话release()
吗?在 native Mat 上,并允许它在 GC 运行时在终结器中实际删除?
最佳答案
由于您要删除 native Mat
和实现 n_delete
是:
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1delete
(JNIEnv*, jclass, jlong self)
{
delete (Mat*) self;
}
GC 将删除 cv::Mat
指针两次,这是不好的。您可以找到 here关于删除指针两次意味着什么的更深入的描述。
关于java - OpenCV JNI : Java/native handling of Mat - possibility for delete getting called twice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770231/