上篇文章介绍了Android studio下Cmake配置编译开发jni总结,这篇介绍JNi开发的细节。Android Jni开发中比java开发不论是在编译阶段还是运行阶段都有更多的细节点需要注意,稍有不慎就会不断地进入填坑模式,扫码加入日志,不断慢慢调试,下面是个人最近开发中所遇到细节整理如下:
1、认识JNI中的JavaVM和JNIEnv对象
在标准的java平台下,每一个Process里面可以产生很多JavaVM对象,每一个java VM对象都有一个与之对应的JavaVM对象。但是,在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指针以及当前调用者对象jobject;
(3)java每个线程在和C/C++互相调用时,JNIEnv是相互独立的,互不干扰,这种做法提升了并发执行时的安全性;
(4)当本地的C/C++