3

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

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

我不相信这种方法会奏效,因为我读到 JNIEnv 指针不能在线程之间共享,并且只有附加到 JVM 的线程才能做这种事情......

这是一种可行的方法吗?

4

1 回答 1

5
  1. JNI_OnLoad,缓存JavaVM*。这是跨线程持久且有效的唯一事物。
  2. 一旦您设置了一些本机线程,调用AttachCurrentThread并获取JNIEnv*,这仅对该单个线程有效。
  3. 使用JavaVM*and JNIEnv*,查找您的jclasses、jobjects 和jmethodIDs。这些仍然仅对您附加的单个线程有效。
  4. jclasses 和jobjects 转换为全局引用,以便它跨线程持久存在。jmethodIDs 不需要全球化,它们不是工作项目。
  5. 在任何其他本机线程上,您再次需要调用AttachCurrentThread以获取该线程的有效值JNIEnv*
  6. 当您不再需要它们时,不要忘记删除创建的全局引用(JNI_OnUnload最迟)
于 2012-11-16T13:48:10.277 回答