java - 强制 Java 调用我的 C++ 析构函数 (JNI)

标签 java c++ java-native-interface

我以为这个问题以前会有人问过,但是我在这里找不到...

我使用 SWIG 围绕 C++ 类创建了一个 JNI 包装器。一切都很好,除了 Java 似乎从未调用类的 finalize(),因此,反过来,我的类的析构函数永远不会被调用。该类的析构函数执行一些最终文件 I/O,因此不幸的是,这不仅仅是轻微的内存泄漏。

Google 了一下,似乎没有办法强制Java GC 并销毁一个对象。真的吗?

我知道我可以操纵我的 SWIG 文件并创建一个调用 C++ 析构函数的 java 函数,但是这个类被多种不同平台/语言的最终用户使用,所以添加一个 Java-only 会造成不一致我们的技术作家不会喜欢的。

最佳答案

您不能使用 System.gc() 强制 GC。 此外,也不能保证 GC 会运行,例如,如果您的应用程序只运行了很短的时间,然后您的终结器根本不会运行(JVM 在退出时不会运行它)。您应该为您的类创建一个 close() 或 destroy() 或任何函数,并在您完成使用此类的实例时调用它,最好从 finally block 中调用它,例如。


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

关于java - 强制 Java 调用我的 C++ 析构函数 (JNI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1014584/

相关文章:

java 知道url的所有子Url

c++ - 为什么c++ ifstream会读取有重复记录的文件

c++ - 如何将值中对象的属性更改为映射

java - 从 java 加载库时出现 "undefined symbol: __cxa_pure_virtual"错误

java - 将 C++ 与 Objective-C 和 Java 混合使用

java - 基于偏航上/下斜坡的更好方法?

java - 我如何用新线程替换函数调用但将变量传递给线程

java - 在 Java 中检查 boolean 数组的最快方法

c++ - 如何从 C/C++ 中的文本文件中读取一行?

java - 在java中使用String来保存二进制数据是错误的吗?