1、JNIEnv类型是一个指向全部JNI方法的指针。该指针只在创建它的线程有效,不能跨线程传递
2、JavaVM是虚拟机在JNI中的表示,一个JVM中只有一个JavaVM对象,这个对象是线程共享的。
通过JNIEnv我们可以获取一个Java虚拟机对象,其函数如下:
jint GetJavaVM(JNIEnv *env, JavaVM **vm);
3、JNIEnv指针仅在创建它的线程有效。如果我们需要在其他线程访问JVM,那么必须先调用AttachCurrentThread
将当前线程与JVM进行关联,然后才能获得JNIEnv对象。当然,我们在必要时需要调用DetachCurrentThread
来解除链接。
jint AttachCurrentThread(JavaVM* vm , JNIEnv** env , JavaVMAttachArgs* args);
- vm:虚拟机对象指针。
- env:用来保存得到的JNIEnv的指针。
- args:链接参数,参数结构体如下所示。
- return:链接成功返回0,连接失败返回其他。
4、在AttachCurrentThread中c层回调java层的时候,要创建java层的对象只能使用jni不通过线程c回调java的函数博客中的env->findClass()的方式,这样会出现问题,不清楚的看博客http://blog.csdn.net/lipeng32768/article/details/42032073
5、在android 8.0系统调试的时候,使用jni不通过线程c回调java的函数博客中方式进行回调,出现了问题,解决的办法是在c层使用pthread创建一个单独的线程进行回调。