gpt4 book ai didi

java - JNI : Invoke JAVA method from C++, 返回对象、引用和 GC

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:19 24 4
gpt4 key购买 nike

当 C++ 程序(!)调用返回对象的 java 方法时,规则是什么?是否有对该对象的突出引用?我必须调用“DeleteLocalRef”来确保该对象是 GCd,还是会自动成为 GCd?我不清楚的原因是,在所有示例和官方文档中,声明“DeleteLocalRef”不是必需的,只有当从 java 调用 native “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.

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

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

  1. Android Activity 在 Java 中启动。
  2. Android Activity 每帧调用一次 C++ 来运行我们应用的更新循环。
  3. 在此 C++ 更新循环中,我们的 C++ 代码使用 JNI 对 Java 进行了任意次数的调用。

我对引用文档的解释是,当我们的 C++ 更新循环返回到最初调用它的 Java 代码时,自动垃圾收集可以而且只会在步骤 2 中发生。

如果您的应用程序在 C++ 中开始执行然后调用 Java,我认为您永远不会有自动本地引用垃圾收集,除非您随后再次从 Java 调用 C++(调用堆栈:C++->Java ->C++),在这种情况下,当您返回到 Java (C++->Java->C++ -> C++->Java).

关于java - JNI : Invoke JAVA method from C++, 返回对象、引用和 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010829/

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