600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > JavaVM和JNIEnv

JavaVM和JNIEnv

时间:2019-04-06 22:21:09

相关推荐

JavaVM和JNIEnv

JavaVM和JNIEnv

1、JavaVM接口

第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。一般都在这个时候保存一个static的JavaVM *jvm,这个jvm指针在进程内是可以放心共享的。

第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args)可以得到JavaVM指针。

两种情况下,都可以用全局变量,比如JavaVM* g_jvm来保存获得的指针以便在任意上下文中使用。

Android系统是利用第二种方式Invocation interface来创建JVM的。

2、JNIEnv接口

JNI开发最常见的错误就是滥用了JNIEnv接口。需要强调的是JNIEnv是跟线程相关的。sdk文档中强调了do not cache JNIEnv*,要用的时候在不同线程中再通过JavaVMjvm的方法来获取与当前线程相关的JNIEnv。

在native method中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?

JNI提供了两个函数:

(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)和(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4)。

两个函数都利用JavaVM接口获得JNIEnv接口,上面已经讲到如何获得JavaVM接口。当创建的线程需要获取JNIEnv的时候,最好在刚创建的时候调用一次AttachCurrentThread,最好还是不要缓存这个JNIEnv,每次需要的时候通过JavaVM*获取,不要忘记线程结束的时候执行DettachCurrentThread。

JNI规范也说明,可以将获得JNIEnv封装成一个函数。

JNIEnv* JNU_GetEnv(){JNIEnv* env;(*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_4);return env;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
扩展阅读