我有一个Android应用程序,它包含一些本机线程(不附加到JVM),需要能够调用Java对象的方法。
我打算这样做的方式是创建一个JNI函数,我从相关的Java对象调用它,这允许我获取并缓存所需的java对象方法ID,JNIEnv和对象引用。一个静态本机数据结构,以便我的本机线程可以(安全地线程)访问所需的方法(例如使用(* env) - > CallVoidMethod(env,this,JavaMethodID,...)等;
我不相信这种方法会起作用,因为我读到JNIEnv指针不能在线程之间共享,并且只有连接到JVM的线程可以做这种事情......
这是一种可行的方法吗?
答案 0 :(得分:2)
JNI_OnLoad
中,缓存JavaVM*
。这是跨线程唯一持久且有效的东西。AttachCurrentThread
并获取JNIEnv*
,这仅对该单个线程有效。JavaVM*
和JNIEnv*
一起,查找您的jclass
es,jobject
和jmethodID
。 这些仅对您附加的单个帖子有效。 jclass
es和jobject
转换为全局引用,以便它跨线程持续存在。 jmethodID
不需要全球化,它们不是工作。AttachCurrentThread
以获取该线程的有效JNIEnv*
。JNI_OnUnload
中)