Dav*_*ell 3 java-native-interface android
我有一个 Android 应用程序,其中包含一些本机线程(未附加到 JVM),它们需要能够调用 Java 对象的方法。
我打算这样做的方式是创建一个 JNI 函数,我从相关的 Java 对象调用该函数,该函数允许我获取并缓存所需的 java 对象方法 ID、JNIEnv 和静态本机数据结构中的对象引用,以便我的本机线程可以(安全地线程)访问所需的方法(例如使用 (*env)->CallVoidMethod(env, this, JavaMethodID, ...) 等;
我不相信这种方法会起作用,因为我读到 JNIEnv 指针不能在线程之间共享,并且只有附加到 JVM 的线程才能做这种事情......
这是一个可行的方法吗?
JNI_OnLoad
,缓存JavaVM*
。这是跨线程唯一持久且有效的东西。AttachCurrentThread
并获取JNIEnv*
,这仅对该单个线程有效。JavaVM*
andJNIEnv*
查找您的jclass
es、jobject
s 和jmethodID
s。这些仍然仅对您附加的单个线程有效。jclass
将es 和s转换jobject
为全局引用,以便它跨线程持续存在。jmethodID
不需要全球化,它们不是工作对象。AttachCurrentThread
有效值。JNIEnv*
JNI_OnUnload
) 归档时间: |
|
查看次数: |
2159 次 |
最近记录: |