当前位置: 首页 > article >正文

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*,要用的时候在不同线程中再通过JavaVM jvm的方法来获取与当前线程相关的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;
}
http://www.lryc.cn/news/2418459.html

相关文章:

  • [教程]Smarty 入门
  • 强烈推荐10本程序员必读的书
  • 2012互联网公司年会美女大盘点
  • [刷机教程] 刷中文recovery V880最简单的刷机教程,更新recovery,修复若干BUG,支持最新ROM
  • PHP+APACHE+MYSQL
  • 新闻事件营销
  • unit5:数据库
  • 怎么完全卸载赛门铁克_卸载Symantec Endpoint Protection, 无需password的卸载方法
  • 数据结构与算法知识要点简明教程(合集)
  • ROUTE.EXE文件丢失导致程序无法运行问题
  • 用Ajax方式提交form表单
  • C/C++生态工具链——单元测试工具Catch2简介
  • java jdbc reparecall_JDBC学习笔记
  • RO11 -用RemObjects SDK创建异步调用客户端
  • Windows7系统sfc_os.dll文件丢失问题
  • 常见游戏外挂分类及原理概述
  • 播放器比的就是画质
  • 电脑回收站无法清空:原因及解决方案大揭秘
  • myeclipse部署时An internal error occurred 错误的几种情况
  • verilog实现多周期处理器之——(六)简单算数操作指令的实现
  • 本人跑fedora 13的烦恼
  • java定时器Timer 类的使用及Timer already cancelled问题解决
  • Apache License Version 2.0中文翻译版
  • 关于Tapestry5运行时报错的解决方法。
  • TransactionScope使用(二)——msdtc不可用
  • hmailserver的反垃圾邮件功能
  • 基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)
  • 《黄金瞳》 台词:你人真好!
  • FreeBSD下Mount总结
  • ISA Server 2004的安装与SMTP 筛选器的使用