无法在JNI中续订jobject

时间:2012-08-28 19:54:32

标签: android c java-native-interface

我的应用是一款带有一些原生代码的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;
}

1 个答案:

答案 0 :(得分:1)

  

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

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

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

jobject myGlobalReference = env->NewGlobalRef(obj);

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