gpt4 book ai didi

android - 无法在 JNI 中更新 jobobject

转载 作者:行者123 更新时间:2023-11-30 15:55:26 27 4
gpt4 key购买 nike

我的应用程序是一个带有一些 native 代码的 Android 应用程序。

Java 代码通过 new Thread(new Runnable) 启动一个线程,在 native 代码中,我通过 AttachCurrentThread 将该线程附加到 JVM。

在该线程中调用的 native 函数是一个无限循环,它将监听简单事件( bool 变量)并调用另一个 native 函数,该函数通过使用正确的 JNIEnv 指针和 jobject 将在 Java 端填充 2 个 java 变量,调用 void 方法来显示数据。该循环的原因是正常调用该函数的开销(需要进行大量分配和销毁)很可能是巨大的。

唯一的问题是,虽然我可以更新 JNIEnv 指针,但我不知道如何为 jobobject 执行此操作。

我所说的 jobject 是指通过函数调用传递给 native 代码的 jobject,如下所示

jint Java_com_example_example_MainActivity_NativeFunc( JNIEnv* env,
jobject obj)
{
return;
}

最佳答案

The Java code starts a thread via new Thread(new Runnable), in the native code, I attach that thread to the JVM via AttachCurrentThread.

您不必将 JVM 附加到使用 Java 代码创建的线程,它已经附加了。

如果我正确理解你的问题,你会得到一个jobobject一次,并希望稍后在其他 native 方法中访问该对象。为此,您可以使用 NewGlobalRef :

jobject myGlobalReference = env->NewGlobalRef(obj);

您可以将该作业对象存储在全局C/C++变量中并在以后使用它。它将保持有效,直到 JVM 终止或您使用 DeleteGlobalRef 删除引用。 。请记住,只要您不删除全局引用,如果对引用对象的所有 Java 引用都消失了,垃圾回收将不会回收引用的对象!

关于android - 无法在 JNI 中更新 jobobject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166590/

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