场景:在Java中传递任意类型参数,在JNI中新开子线程,将传入的参数处理后回调Java中的方法
技术点:
1、在JNI中新开子线程并传递参数
2、在子线程中回调Java方法(误区:JNIEnv指针可以共享)
对于技术点1,可参考一般的C++开发教程,一般创建子线程的方法有:
- 通过pthread_create
- C++11中thread的用法
另外要注意的是传递的参数应当是堆内存中的指针,或者是全局变量,对于局部变量,可能在子线程中调用时已经失效。
对于技术点2,需要注意的是
JNIEnv
*这类指针是无法在线程间共享的,参考JNI文档。
步骤:
- 在JNI_OnLoad或者Java调用的native方法中缓存JavaVM*,JavaVM*指针是唯一在线程间可以共享的。
- 在子线程的native方法中调用AttachCurrentThread ,获取JNIEnv*指针。
- 通过JavaVM*和JNIEnv*找到你需要的jclasses,jobjects,jmethodIDs,它们不能在线程间共享。
- 如果需要,将jclasses,jobjects转换为全局变量,jmethodIDs不需要转换,因为它不是对象。
- 在JNI_OnUnlaod时删除全局变量这类引用,当你不再需要时。
理解
JNI_OnLoad、JNI_OnUnload