JNI:正确管理Java对象的生命周期

时间:2012-10-24 00:07:14

标签: android c++ android-ndk java-native-interface

当我在c ++中创建本机实现对等体时,如何确保在JVM删除java对象时也删除本机部分?我可以添加一些java对象的用户必须显式调用的方法,但我想知道是否有一些钩子,我可以在删除java对象时进行处理(垃圾收集),以便我可以自动删除c ++实现对象同样。

我回顾JACE似乎它确实如此,但是我需要运行PeerEnhancer来修补生成的类文件(可能它是如何挂钩删除?或者它可能需要修补其他内容)。但是,我想避免搞乱编译的java文件,我不想要任何花哨的东西

2 个答案:

答案 0 :(得分:2)

这是一个罕见的情况,你应该真正使用终结器,但你也应该使你的Java类也可以使用。

答案 1 :(得分:2)

请注意,通过接受终结器,您在最糟糕的地方搔痒JVM。在终结器()中调用JNI就像在驾驶时调整发动机气门正时。虽然技术上是可行的,但最终还是容易导致JVM泄漏或崩溃。即使是最轻微的多线程触摸,您肯定会在某些时候死锁/崩溃。如果你说“我不想要任何花哨的东西”,我建议使用明确调用的方法。是的,按照惯例要求某些方法顺序是脏设计,但是JNI一般都很脏。

如果受尊重的JNI库执行秘密类检测而不是简单地使用终结器,那么它可能有一个原因。一些推荐的阅读(甚至没有提到JNI!):

http://asserttrue.blogspot.com/2008/11/finalization-is-evil.html

http://elliottback.com/wp/java-memory-leaks-w-finalize-examples/

我的建议是:是的,使用虚方法detachFromPeer()实现一个基类,在其中设置一些“分离”标志,然后在终结器中只检查标志并发出警告。