强迫Java称我的C ++破坏者(JNI)

 2023-01-19    360  

问题描述

我以为这个问题以前曾被问到,但我在这里找不到它…

我已经使用SWIG在C ++类周围创建JNI包装器.一切都很好,除了Java似乎从来没有称呼该类的最终确定(),因此,我班级的驱动器从未被打来.该类的destructor执行了一些最终文件I/O,因此不幸的是,这不仅仅是次要内存泄漏.

强迫Java称我的C ++破坏者(JNI)

通过Google进行搜索,似乎没有一种方法可以强迫Java进入GC并销毁对象.是吗?

我知道我可以操纵我的swig文件并创建一个称为C ++驱动器的Java函数,但是最终用户使用几种不同的平台/语言使用此类,因此添加仅Java,将创建不一致之处我们的技术作家不会喜欢.

推荐答案

您不能用system.gc()强制GC.
另外,不能保证会有GC运行,例如,如果您的应用程序仅在短时间内运行,那么您的最终器就根本不会运行(JVM在退出时不会运行它).您应该创建一个Close()或Destract()或类的任何功能,并且使用此类实例完成后,最好是从最终块中,例如.

MyClass x = null;
try{
    x = new MyClass();
    x.work();
} finally {
    if (x!=null)
        x.close();
}

在我看来,

其他推荐答案

Java最终化器大多是没有用的,当然不是C ++破坏者的替代者.不幸的是,Java无法替代C ++ RAII.

不要费心尝试强制Java最终化.当您经历任何内容时,所有将处理它的函数.这就是您所能做的.

其他推荐答案

如果您依靠finalize方法中的代码在一定时间运行,则需要重新考虑您的方法.这里的问题在于,您不知道何时会由JVM调用finalize,因为您不知道该对象何时会收集垃圾.

您应该考虑的一件事,因为您的班级将在其他项目中重复使用,是最终用户可以使用类实例,以使其无法收集或垃圾收集不太可能,例如创建对类实例的静态引用.我认为创建close或destroy方法是您最安全的选择,以确保适当地发布与Java对象关联的C ++类的实例.

由于重复使用是一个问题,因此您可以检查C ++驱动器检查是否已发布资源,并在相同的代码中调用相同的代码,例如:

:

class MyThing {
  public:
    void close();
    ~MyThing();

  private:
    bool released = false;
};

void
MyThing::close() {
  // close logic here
  this->released = true;
}

MyThing::~MyThing() {
  if (!released) {
    this->close();
  }
}

以这种方式,您现有的C ++代码希望不必更改太大,您可以确保在通过JNI运行的本机代码的上下文中以确定性的方式发布资源.

以上所述是小编给大家介绍的强迫Java称我的C ++破坏者(JNI),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25823.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。