[英]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.