gpt4 book ai didi

android - JNI : properly manage lifetime of a Java object

转载 作者:搜寻专家 更新时间:2023-11-01 07:34:47 25 4
gpt4 key购买 nike

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

我评论了JACE它似乎是这样做的,但我需要运行 PeerEnhancer 来修补生成的类文件(可能这就是它 Hook 删除的方式?或者它可能需要这个修补来做其他事情)。但是,我想避免弄乱已编译的 java 文件,我不想要任何花哨的东西

最佳答案

请注意,通过采用终结器,您可能会在最糟糕的地方挠挠 JVM。在 finalizer() 中调用 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() 实现一个基类,在其中设置一些“分离”标志,然后在终结器中检查标志并发出一些警告。

关于android - JNI : properly manage lifetime of a Java object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com