打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JNI系列(3):如何得到JavaVM,JNIEnv接口

JNI系列(3):如何得到JavaVM,JNIEnv接口

(2011-04-19 14:04:36)
标签:

ndk

jni

改写

dll库

.so库

接口

load

it

分类: NDK与JNI

在系列(1)中讲到,Java与native code的操作有两种方式:(1)在Java中加载动态链接库(2)使用JNI Invocationinteface,在native code中创建JVM

JavaVM接口

第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void*reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。

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

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

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

JNIEnv接口

JNI开发最常见的错误就是滥用了JNIEnv接口。需要强调的是JNIEnv是跟线程相关的。

在nativemethod中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?JNI提供了两个函数:(*jvm)->AttachCurrentThread(jvm,(void**)&env,NULL)和(*jvm)->GetEnv(jvm,(void**)&env, JNI_VERSION_1_2)。两个函数都利用JavaVM接口获得JNIEnv接口,上面已经讲到如何获得JavaVM接口。

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

 

JNIEnv*JNU_GetEnv()

{

   JNIEnv* env;

   (*g_jvm)->GetEnv(g_jvm,(void**)&env, JNI_VERSION_1_2);

   return env;

}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Android】【转】JavaVM和JNIEnv
当JNI遇到多线程--java对象如何被C++中的多个线程访问?
JNI官方规范中文版——在程序中集成JVM需要注意的JNI特征
JNI与Android VM之间的关系---- 本文摘录自 高焕堂老师 的Android课...
Android JNI开发入门之二
JNI设计实践之路
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服