gpt4 book ai didi

java - Android JNI 和 NewGlobalRef

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:44 29 4
gpt4 key购买 nike

我正在使用 SDL,几乎解决了我遇到的所有问题。

我正在调用 jni 来初始化框架,然后从中创建一个全局引用,因为这是我目前能想到的最佳方式。

我的大多数 JNI 函数都使用实例变量,除了一个用来读取文件。这就是我设置 globalref 的方式。

JNIEXPORT void JNICALL SDL_Android_Init(JNIEnv* mEnv, jobject instance)
{
Android_JNI_SetupThread();
mInstance = instance;

jclass clazz = (*mEnv)->GetObjectClass(mEnv, instance);
mActivityClass = (jclass)((*mEnv)->NewGlobalRef(mEnv, clazz));
.....
}

我在这段代码中只用了两次这个mActivityClass全局引用来读做一些可以随时调用的函数。

主要问题,专门针对android JNI。如果我坚持使用那个 globalref,因为 android 控制它的应用程序生命周期,ref 将导致我的应用程序“恢复”,即使我试图退出也是如此。

如果我尝试用 DeleteLocalRef 之类的东西清除 globalref,应用程序似乎仍然想要恢复而不是退出。有没有办法阻止这种行为?

另一个问题,是否可以创建一个从代码世界的 c 端调用的非静态 JNI 函数,以便我可以获得一个实例 jobject 并使用它来获取类实例?

例如,通常您在 java 中编写一个函数:

public native void do_c_work();

在c端:

void Java_com_test_java_do_c_work(JNIEnv* env, jobject inst)
{
...use the instance do your work
}

如果某些函数在 c 端被调用,那我想从 java 获取一个实例来做一些事情。

c函数:

public int get_number();

我有点卡在这里,此时我不想实例化一个新的java对象,主要是因为i saw this这似乎有点矫枉过正。

必须有一种方法来克服这个障碍,或者通过能够在不使用静态的情况下从 c 调用 java 或创建一个新的 Activity ,那里已经有一个或释放 globalref 但这似乎没有用这一刻对我来说很好。

最佳答案

一些注意事项:

  1. JNI 全局引用不会强制您的应用程序保持打开状态。垃圾收集器知道它们,但控制生命周期的应用程序框架却不知道。应用程序框架本身创建了大量全局引用。 (应用程序不是“垃圾收集”。)

  2. 如果要删除全局引用,请使用 DeleteGlobalRef,而不是 DeleteLocalRef

  3. 如果您想从 C 调用非静态 Java 语言方法,将对象传递给 native 代码,然后 invoke a method在上面。如果您要在 native 方法返回到 VM 后使用它,请为作业对象创建一个全局引用。 (我觉得我可能不理解这部分问题。)

另见 JNI TipsJNI spec .

关于java - Android JNI 和 NewGlobalRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32685927/

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