JNI:如何处理包装的C++对象的创建/删除

4
我想封装一个C++对象,以便我可以从Java中访问它。通过阅读 jni and using c++ new'ed objects in java,我已经了解了如何在我的Java包装器类中保存对C++对象的引用。然而,有一件事我还没有弄清楚,那就是如何处理我的C++对象的创建和删除。当然,我可以引入本地方法来创建和删除我的C++对象,但这意味着我必须在Java中自己管理内存,这并不符合Java的风格。是否有任何本地方法我应该实现,以便在创建和销毁我的Java包装器对象时会被调用?
1个回答

7

您需要编写本地方法来创建和销毁C++对象。我知道有3种不同的方式可以使用Java调用这些方法。

  • 为你的Java对象实现public void finalize()方法。垃圾回收器将在对象被销毁时调用此方法,因此您可以在此处调用destroy方法,垃圾回收器会处理一切。finalize()也有它的缺点,例如它会减慢垃圾回收器的速度,并且会从不同的线程调用。

  • 编写一个dispose()方法并手动管理内存。这是Swing/AWT用于本地资源的方法。这使您可以控制何时和何处删除C++对象。您仍然可以实现finalize()以防止内存泄漏/调试代码。

  • 使用PhantomReference类和ReferenceQueue来检查是否有一个对象被垃圾回收并从中删除C++对象。这提供了一个替代finalize()的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接