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

时间:2011-01-14 16:34:58

标签: java c++ object java-native-interface wrapper

我想包装一个C ++对象,以便我可以从Java访问它。我已经了解了如何通过阅读jni and using c++ new'ed objects in java在我的Java包装器类中保存对C ++对象的引用。但是,我还没想到的一件事是如何处理我的C ++对象的创建和删除。当然,我可以介绍创建和删除我的C ++对象的本机方法,但这意味着我必须自己处理Java中的内存管理...不是很Javaish。是否有我应该实现的本机方法在创建Java包装器对象并进行垃圾收集时调用?

1 个答案:

答案 0 :(得分:7)

您必须编写本机方法来创建和销毁您的c ++对象。我知道如何使用java调用它们有3种不同的方法。

  • 为您的java对象实现public void finalize()方法。一旦你的对象被完成,​​垃圾收集器就会调用这个方法,所以你可以在这里调用destroy方法,垃圾收集器会处理所有事情。 finalize()有它的缺点,它会减慢垃圾收集器的速度,并且会从不同的线程中调用它来命名一些。

  • 编写dispose()方法并手动管理你的记忆。 swing / AWT用于本机资源。这使您可以控制删除c ++对象的时间和位置。您仍然可以实现finalize()来停止内存泄漏/调试代码。

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