0

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

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

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

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

通过jobject,我的意思是通过函数调用传递给本机代码的jobject,如下所示

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

1 回答 1

1

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

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

如果我正确理解了您的问题,您将获得jobject一次并希望稍后在其他本机方法中访问该对象。为此,您可以使用NewGlobalRef

jobject myGlobalReference = env->NewGlobalRef(obj);

您可以将其存储jobject在全局 C/C++ 变量中并稍后使用。它将一直有效,直到 JVM 死亡或您使用DeleteGlobalRef删除引用。请记住,只要您不删除全局引用,如果对它的所有 Java 引用都消失了,垃圾收集将不会收集引用的对象!

于 2012-09-07T18:20:00.713 回答