1.JNI简介
JNI全称为Java Native Interface;
从Java1.1开始,JNI就成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互;
并非从Android发布才引入JNI的概念的。
2.什么是NDK?
NDK全称为native development kit本地语言(C&C++)开发包;
NDK提供了一些交叉编译工具链和Android自带的库;
这些Android的库可以让开发者在编写本地语言的程序时调用;
而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
3.JNI的基本调用流程
1).Android应用层以Java为基础,.java文件在被编译成.dex文件后必须要通过Dalvik虚拟机( Virtual Machine)来执行;
2).执行过程中如果需要用到本地方法(即C/C++函数库),Dalvik则去加载C/C++本地函数库(System.loadLibrary("libName"););
注意:由于C/C++本地函数库并不运行在Dalvik虚拟机中,所以效率和速度都相对较快;
3).Dalvik虚拟机加载C/C++函数库成功之后会自动地寻找库里面的JNI_OnLoad函数(关于JNI_OnLoad函数后面会有详细说明);
4).虚拟机释放C/C++函数库时,与JNI_OnLoad函数相对应的JNI_OnUnLoad函数会被调用,用以处理善后清除工作。
4.关于JNI_OnLoad函数的一些说明
1).告知Dalvik虚拟机该C/C++函数库使用哪一个JNI版本;
2).库中没有该函数时默认使用JNI1.1版本;
3).新版JNI在功能上有很多的扩展,想要使用这些新功能必须在JNI_OnLoad()函数中声明JNI的版本:
1 result = JNI_VERSION_1_4;
4).库中没有JNI_OnLoad()函数时,Android调试信息会给出"No JNI_OnLoad found"的提示;
5).C/C++函数库加载完成后首先调用JNI_OnLoad()方法,可以在该方法中进行一些初始化工作,如注册JNI函数等等(可加快调用效率和速度);