原生多线程和JNI

时间:2012-11-14 17:18:13

标签: android java-native-interface

我有一个Android应用程序,它包含一些本机线程(不附加到JVM),需要能够调用Java对象的方法。

我打算这样做的方式是创建一个JNI函数,我从相关的Java对象调用它,这允许我获取并缓存所需的java对象方法ID,JNIEnv和对象引用。一个静态本机数据结构,以便我的本机线程可以(安全地线程)访问所需的方法(例如使用(* env) - > CallVoidMethod(env,this,JavaMethodID,...)等;

我不相信这种方法会起作用,因为我读到JNIEnv指针不能在线程之间共享,并且只有连接到JVM的线程可以做这种事情......

这是一种可行的方法吗?

1 个答案:

答案 0 :(得分:2)

  1. JNI_OnLoad中,缓存JavaVM*。这是跨线程唯一持久且有效的东西。
  2. 一旦设置了一些本机线程,请调用AttachCurrentThread并获取JNIEnv*,这仅对该单个线程有效。
  3. JavaVM*JNIEnv*一起,查找您的jclass es,jobjectjmethodID这些仅对您附加的单个帖子有效。
  4. jclass es和jobject转换为全局引用,以便它跨线程持续存在。 jmethodID不需要全球化,它们不是工作。
  5. 在任何其他本机线程上,您再次需要调用AttachCurrentThread以获取该线程的有效JNIEnv*
  6. 当您不再需要时,不要忘记删除已创建的全局引用(最迟在JNI_OnUnload中)