如何得到JavaVM,JNIEnv接口
在系列(1)中讲到,Java与native code的操作有两种方式:(1)在Java中加载动态链接库(2)使用JNI Invocation inteface,在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是跟线程相关的。
在native method中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?JNI提供了两个函数:(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)和(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_2)。两个函数都利用JavaVM接口获得JNIEnv接口,上面已经讲到如何获得JavaVM接口。
JNI规范也说明,可以将获得JNIEnv封装成一个函数。
1
2
3
4
5
6
|
JNIEnv* JNU_GetEnv()
{
JNIEnv* env;
(*g_jvm)->GetEnv(g_jvm, ( void **)&env, JNI_VERSION_1_2);
return env;
}
|
如何得到JavaVM,JNIEnv接口相关推荐
- java.vm.info_JNI完全指南(十)——JavaVM与JNIEnv
JNI完全指南(十)--JavaVM与JNIEnv JNI完全指南版本:1 作者:陈小默 声明:禁止商业,禁止转载 十.JavaVM与JNIEnv 10.1 JNIEnv JNIEnv类型是一个指向全 ...
- 【Android 系统开发】Android JNI 之 JNIEnv 解析
. jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android ...
- Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF
JNIEnv是指向可用JNI函数表的接口指针,原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能.JNIEnv是一个指向线程-局部数据的指针,而线程-局部数据中包含指向线程表的指针.实现 ...
- Android JNI 之 JNIEnv 解析
jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是$/android-ndk-r9d/platforms/android-19 ...
- android native java_在Android Native层中创建Java虚拟机实例
前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...
- JNI 实战全面解析
项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究. JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言 ...
- Android系统启动过程全解析
Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...
- 通过exe启动class
通过exe启动class 昨天下载了号称纯java版的网游<海天英雄传>, 发现其将包括jvm.dll在内的所有组件及所有class全部封装使用,觉得这种方式比较可行,既保证了理论上的纯j ...
- 在Android Native层中创建Java虚拟机实例
前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...
- 图解Android - Zygote, System Server 启动分析
Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...
最新文章
- 六、springboot整合swagger
- 人工智能赋能中国健康医疗服务
- #51CTO学院四周年# 成长路上的我和你
- Gnuplot使用x11终端自动注销问题
- YTU_3137: 动态规划基础题目之拦截导弹
- Ardino基础教程 24_RGB全彩LED
- win10删除开机密码_新版WIN10 如何取消开机密码的操作
- 关于python进行批量数据备份及部署
- Nginx的初步安装
- Python isdigit() isalnum()
- 特斯拉要退市!马斯克内部信:不受华尔街摆布;股价大涨10%
- 基于Python从头开始使用 RMSProp 进行梯度下降
- 安装KeMotion3 03.16d时遇到的问题
- 虚拟机xfs文件系统因根分区爆满损坏修复
- lookup基础用法
- js编写五种基础排序(冒泡排序、选择排序、插入排序、快速排序、sort)
- 自编码神经网络相似图片检索
- 【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
- 企业管理项目应该选择什么项目管理系统?
- 纯前端实现xls表格下载
热门文章
- 小马哥---深度解析mtk刷机平台报错解决 4032 8038等
- 拉普拉斯方程的解matlab,急求用matlab编写解拉普拉斯方程的程序
- 快手上市,有一批员工平均身家超3200万,但追赶抖音没那么简单
- 联邦学习后门攻击代码阅读——backdoors101
- 【地理工具学习—MapGIS教程】常见问题处理
- java运行环境安装及配置教程
- link服务器间网络通讯错误_LINK-服务器间网络通讯错误
- 【数字电路基础】——逻辑门电路
- matlab时频分析
- 利用计算机指令清理垃圾,计算机Dos处理,编写一键清理系统垃圾的bat代码,小白都可以学...