JNIEnv和Dalvik的JavaVM的关系

原创 2016年02月17日 20:51:53
(1)JNIEnv*内部包含一个Pointer,Pointer指向Dalvik的Java VM对象的Function Table,JNIEnv*关于程序执行环境的众多函数正是来源于Dalvik虚拟机;
(2)Android中每当一个Java线程第一次要调用本地C/C++代码时,Dalvik虚拟机实例会为该Java线程产生一个JNIEnv*指针;
(3)Java每条线程在和C/C++相互调用时,JNIEnv*是相互独立的,互不干扰,这就提升了并发执行时的安全性;
(4)当本地的C/C++代码想获得当前线程所想要使用的JNIEnv时,可以使用Dalvik VM对象的JavaVM* jvm->GetEnv()方法,该方法即会返回当前线程所在的JNIEnv*。
(5)Java的dex字节码和C/C++的*.so同时运行Dalvik VM之内,共同使用一个进程空间
当Java代码需要C/C++代码时,在Dalvik虚拟机加载进*.so库时,会先调用JNI_OnLoad()函数,此时就会把JavaVM对象的指针存储于C层JNI组件的全局环境中,在Java层调用C层的本地函数时,调用C本地函数的线程必然通过Dalvik VM来
调用C层的本地函数,此时Dalvik虚拟机会为本地的C组件实例化一个JNIEnv指针,该指针指向Dalvik虚拟机的具体的函数列表,当JNI的C组件调用Java层的方法或者属性时,需要通过JNIEnv指针来进行调用。
当C++组件主动调用Java的方法或者属性时,需要通过JNI的C组件把JNIEnv指针传递给C++组件,此后,C++组件即可通过JNIEnv指针来掌控Java层代码。

【Android JNI】JNIEnv和JavaVM的区别

JNI的实现可涉及两个关键类:JNIEnv和JavaVM。 JavaVM:这个代表java的虚拟机。所有的工作都是从获取虚拟机的接口开始的。             第一种方式,在加载...
  • ZjuCstZk
  • ZjuCstZk
  • 2014年10月15日 21:30
  • 3359

JNI完全指南(十)——JavaVM与JNIEnv

JNI完全指南(十)——JavaVM与JNIEnv标签(空格分隔): JNI完全指南版本:1 作者:陈小默 声明:禁止商业,禁止转载 发布于:作业部落、简书、[CSDN博客]上一篇:JNI完全指南(九...
  • qq_32583189
  • qq_32583189
  • 2016年11月15日 16:01
  • 2033

【Android 系统开发】Android JNI 之 JNIEnv 解析

.jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android-...
  • han1202012
  • han1202012
  • 2014年07月21日 21:49
  • 11755

Android的NDK开发(1)————Android JNI简介与调用流程

/********************************************************************************************  * aut...
  • conowen
  • conowen
  • 2012年04月29日 18:12
  • 52958

[笔记] 用C++通过JavaVM调用jar包

看了半天文档,Java的swing写个List要那么多代码...而后台基础都用Java写好了...想移植到C++上,咋办呢? #include "jni.h" #include "windows.h"...
  • prog_6103
  • prog_6103
  • 2011年04月30日 01:06
  • 6785

JavaVM运作原理

  • 2014年10月27日 21:00
  • 1.99MB
  • 下载

JavaVM和JNIEnv

JavaVM接口 第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM...
  • tanningzhong
  • tanningzhong
  • 2015年09月14日 19:58
  • 663

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

在系列(1)中讲到,Java与native code的操作有两种方式:(1)在Java中加载动态链接库(2)使用JNI Invocation inteface,在native code中创建JVMJa...
  • a739924135
  • a739924135
  • 2016年06月20日 17:45
  • 817

Android底层JNI中的JavaVM和JNIEnv对象

最近在做关于安卓安全方面的东西,需要对底层进行注入,在看雪论坛上看了不少资料,查阅了相关书籍了解了一下,需要用到JNI。利用JNI可以实现Java和底层的C/C++模块相互沟通(NDK的框架用到了该外...
  • hubinbin595959
  • hubinbin595959
  • 2015年10月16日 14:09
  • 982

关于AttachCurrentThread和DetachCurrentThread的故事

当在一个线程里面调用AttachCurrentThread后,如果不需要用的时候一定要DetachCurrentThread,否则线程无法正常退出。 static JNIEnv *Adapter...
  • wangchenggggdn
  • wangchenggggdn
  • 2012年08月01日 18:25
  • 23346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNIEnv和Dalvik的JavaVM的关系
举报原因:
原因补充:

(最多只允许输入30个字)