JNI:从C调用JAVA方法,返回对象,引用和GC

当C程序(!)调用返回对象的
java方法时,规则是什么?是否有一个很好的参考这个对象?

我必须调用“DeleteLocalRef”来确保对象是GCd,还是自动GCd?我不清楚的原因是因为在所有示例和官方文档中都说“DeleteLocalRef”不是必需的,只有当从java调用本机“C/C++”方法时才对我有意义.但是如果调用线程是一个调用java的C方法,那么JVM将如何知道该对象可以是GCd?

沿着同样的路线:如果我想缓存对象,我必须调用“NewGlobalRef”吗?

找不到任何对此的引用……

感谢您的任何参考和/或澄清

最佳答案 我认为
j.holetzeck的答案遗漏了重要的部分.

从同一个documentation

实现本地引用

To implement local references, the Java VM creates a registry for each transition of control from Java to a native method. A registry maps nonmovable local references to Java objects, and keeps the objects from being garbage collected. All Java objects passed to the native method (including those that are returned as the results of JNI function calls) are automatically added to the registry. The registry is deleted after the native method returns, allowing all of its entries to be garbage collected.

我将以我的应用程序为例解释我对此的解释:

我的应用程序流程的高级概述:

> Android Activity在Java中推出.
>每帧一次,Android Activity调用C来运行我们的应用程序的更新循环.
>在此C更新循环期间,我们的C代码使用JNI对Java进行任意数量的调用.

我如何解释引用的文档是自动垃圾收集只能在步骤2中发生,当我们的C更新循环返回到最初调用它的Java代码时.

如果您的应用程序在C中开始执行然后调用Java,我认为您不会有自动本地引用垃圾收集,除非您再次从Java调用C(调用堆栈:C – > Java-> C) ,在这种情况下,当您返回Java时,您在最顶层C函数中所做的任何引用都将被GC(C – > Java-> C – > C – > Java).

点赞