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

AOO*_*AOO 4 c++ java java-native-interface object wrapper

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

jos*_*efx 7

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

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

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

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