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