繁体   English   中英

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

[英]JNI: How to handle the creation/removal of wrapped C++ object

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

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

  • 为您的java对象实现public void finalize()方法。 对象完成后,垃圾收集器将调用此方法,因此您可以在此处放置对destroy方法的调用,垃圾收集器将处理所有事情。 finalize()有其缺点,它会降低垃圾收集器的速度,并会从其他线程中调用它,仅举几例。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM