2012-08-28 27 views
0

我的应用程序是一个带有一些本机代码的Android应用程序。无法续约JNI中的jobject

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

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

唯一的问题是,虽然我可以更新一个JNIEnv指针,但我不知道如何为jobject做这件事。

而且通过jobject我的意思是这是通过函数调用传递到本地代码,如jobject所以

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

如果您打算在本机代码中保留一个对象的引用,您需要通过创建新的全局引用或新的弱全局引用来明确保留引用(并且可能稍后将其释放)。在后一种情况下,您还需要在使用它之前检查是否与null等价。 – technomage

+0

如果你的意思是“更新”,那么请解释一下,因为AFAIK“renew”并不是Java中的标准术语。 – technomage

回答

1

的Java代码开始通过新的Thread线程(新的Runnable),在本地代码,我通过AttachCurrentThread将该线程附加到JVM。

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

如果我正确理解你的问题,你会得到一个jobject一次,并希望稍后在其他本地方法中访问该对象。为了实现这个目标,您可以使用NewGlobalRef

jobject myGlobalReference = env->NewGlobalRef(obj); 

可以存储jobject在一个全球性的C/C++变量,并在以后使用它。它将保持有效,直到JVM死亡或您通过DeleteGlobalRef删除参考。请记住,垃圾收集将不会收集被引用的对象,如果所有的Java引用都没有了,只要你不删除你的全局引用!