我的应用程序是一个带有一些 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/