java - OpenCV JNI : Java/native handling of Mat - possibility for delete getting called twice?

标签 java c++ opencv java-native-interface

我正在开发一个项目,我在 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/

相关文章:

java - 构造类实例时重写方法

java - Android 项目构建成功但运行失败,错误为 : java. util.zip.ZipException:重复条目

java - 从 eclipse 插件上下文中使用 JUnit4TestAdapter 的问题

c++ - 使用堆栈比较字符串

c++ - 引用常量变量的用例

opencv - DFT 和 FFT(幅度)结果之间的差异

python - 用opencv python删除背景

java - Java ObjectInputStream提供了java.io.EOFException

c++ - MQTT C++客户端

opencv - 如何将以像素为单位的焦距转换为毫米 (mm)?