找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 194|回复: 0

浅谈 JNIEnv 和 JavaVM

[复制链接]

2万

主题

135

回帖

13万

积分

管理员

积分
137739
发表于 2022-1-5 12:31:16 | 显示全部楼层 |阅读模式 IP:山东省 移动/数据上网公共出口

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、概念

1. JavaVm
JavaVM 是虚拟机在 JNI 层的代表,一个进程只有一个 JavaVM,所有的线程共用一个 JavaVM。

2. JNIEnv
JNIEnv 表示 Java 调用 native 语言的环境,是一个封装了几乎全部 JNI 方法的指针

JNIEnv 只在创建它的线程生效,不能跨线程传递,不同线程的 JNIEnv 彼此独立。

native 环境中创建的线程,如果需要访问 JNI,必须要调用 AttachCurrentThread 关联,并使用 DetachCurrentThread 解除链接。



二、两种代码风格(C/C++)
JavaVM 和 JNIEnv 在 C 语言环境下和 C++ 环境下调用是有区别的,主要表现在:

C风格:

C++风格:

建议使用 C++ 风格,这也是大部分代码使用的形式。

注意:C++ 风格其实只是封装了 C 风格,使得调用更加简介方便。



三、定义
1. JavaVM 和 JNIEnv 在 <jni.h> 中的定义如下:

这里分了 C 和 C++。如果是 C++ 环境下,则只是对 _JNIEnv 和 _JavaVM 的一个重命名;如果是 C 环境下,则是指向 JNINativeInterface 结构体和 JNIInvokeInterface 结构体的指针。



2. 继续看 JNINativeInterface 结构体和 JNIInvokeInterface 结构体的定义



出于篇幅考虑,这里省略了一下 JNINativeInterface 结构体,它里面还包含了大量的方法。

所以我们可以知道,C 风格下的 JavaVM 和 JNIEnv 就是指向的这两个结构体的指针,通过这两个指针我们可以调用到这两个结构体里的各个方法。那么 C++ 风格下的 _JNIEnv 和 _JavaVM 又是怎么定义的呢?



3. _JNIEnv 和 _JavaVM



这里还是省略了很多 _JNIEnv 里的方法。

通过上面代码我们可以看到,_JNIEnv 和 _JavaVM 其实只是对 JNINativeInterface 和 JNIInvokeInterface 结构体的一层封装,实际调用和操作的还是 JNINativeInterface 和 JNIInvokeInterface 里的方法。



四、总结
以上,我们可以简单的了解和认识到 JavaVM 和 JNIEnv 在 JNI 开发中扮演的角色,我们 JNI 的绝大多数操作都是通过这两者来调用到 JNINativeInterface 和 JNIInvokeInterface 结构体里的相关方法。

其中 JavaVM 是一个全局变量,一个进程只有一个 JavaVM 对象。

而 JNIEnv 是一个线程拥有一个,不同线程的 JNIEnv 彼此独立。

最后由于 JavaVM 和 JNIEnv 在 C/C++ 环境下的实现不同,所以产生了两种代码风格,即:

C风格:

C++风格:

————————————————
版权声明:本文为CSDN博主「阿飞__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/afei__/article/details/80986203

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|时间戳|加密|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|IOTsec-Zone|在线工具|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-9-17 04:34

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表