我的应用是一款带有一些原生代码的Android应用。
Java代码通过新的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;
}
答案 0 :(得分:1)
Java代码通过新的Thread(new Runnable)启动一个线程,在本机代码中,我通过AttachCurrentThread将该线程附加到JVM。
您不必将JVM附加到使用Java代码创建的线程,它已经附加。
如果我正确理解了您的问题,您将获得一次jobject
,并希望稍后在其他本机方法中访问该对象。为此,您可以使用NewGlobalRef:
jobject myGlobalReference = env->NewGlobalRef(obj);
您可以将jobject
存储在全局C / C ++变量中,稍后再使用它。它将保持有效,直到JVM死亡或您使用DeleteGlobalRef删除引用。请记住,只要您不删除全局引用,如果所有Java引用都消失了,那么垃圾收集将不会收集引用的对象!