Android中JNI原理基石

核心原理是DalvikVM由native启动

每个应用程序都是由一个或多个进程组成,每个进程都对应着一个DalvikVM。DalvikVM是由代码native启动,在DalvikVM启动后,会返回一个JavaVM结构体。每个线程又对应着一个JNIEnv的结构体。也就是说整个进程都在native的管理之下,所以native可以非常容易的改变DalvikVM内部的数据。但是呢,但是从Java层调用native层,还是从native层调用Java层,则得靠约定的函数形式才能进行,也就是JNI中的javah命令产生的一组映射函数。

JNI程序开发的一般步骤:

  1. 编写带有native申明的java方法
  2. 使用javah -jni java类名 生成C++的头文件,就是.h文件
  3. 完成.h文件下的所有方法
  4. java中load动态链接库文件(不要带.so后缀)

再来看JavaVM与JNIEnv结构体的关系

在Android平台上,每一个Process只能产生一个DalvikVM对象,在一个Android的进程中,是有且只有一个虚拟器对象来服务所有的Java和C/C++代码的。
Android中JNIEnv对象和Dalvik的Java VM对象的关系如下:

  1. 一个JNIEnv内部包含一个Pointer,指针指向Dalvik的Java VM对象的FunctionTable,JNIEnv关于程序执行环境的众多函数正是来源于Dalvik虚拟机;
  2. Android中每当一个java线程第一次要调用本地C/C++代码时,Dalvik虚拟机实例会为该java线程产生一个JNIEnv*指针;
  3. java每个线程在和C/C++互相调用时,JNIEnv*是相互独立的,互不干扰,这种做法提升了并发执行时的安全性;
  4. 当本地的C/C++代码想获得当前线程所要使用的JNIEnv时,可以使用Dalvik VM对象的JavaVMjvm->GetEnv()方法,该方法会返回当前线程所在的JNIEnv
    原文作者:ReadyShow
    原文地址: https://www.jianshu.com/p/a925479b41be
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞