JNI(Java Native Interface)java本地接口,是android设备中Java代码和c/c++等底层代码相互沟通的机制,通过JNI,java代码个底层代码可以互相调用。在实际项目中,这种本地接口是非常必要的,因为java代码是不能驱动android硬件设备的,比如调用语音识别设备时,需要在底层利用c/c++代码进行硬件设备驱动和声音采集等操作,然后通过JNI让上层应用进行调用,从而达到java语音调用硬件接口的目标。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。


NDK(Native Development Kit)本地开发包,它提供了一系列的工具,通过它开发者可以快速地开发c/c++的动态库so,并能自动将so和java应用一起打包成apk。需要注意的是,so文件在打包成apk的过程中自身的体量是不会变的,不会被压缩。在创建的so文件时,我们只需要修改mk文件即可。


JNI的创建过程大致如下:


1、编写包含native本地方法的java类
2、通过javah工具生成C/C++语言的头文件
3、使用C/C++语言实现头文件
4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库
5、实际执行Java代码去和本地的C/C++代码互相沟通



ABI(Application Binary Interface)应用程序二进制接口,定义了二进制文件(尤其是so文件)如何运行在相应的系统平台上,从使用的指令集,内存对其到可用的系统函数库。简单来说,通过abi接口,c/c++ 文件可以转化为运行在各种平台上的so文件。


Android设备有多种CPU内核架构,其中每一种的cpu架构关联一种abi。Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)。


需要注意的是:各类型的abi是向下兼容的,比如ARMv8架构的android设备可以执行ARMv5、ARMv7关联设备上编译出来的so文件的。同样,x86_64架构的android设备可以执行x86关联平台上编译出来的so文件。但是,我们最好是特定型号的android设备运行改型号ABI下编译出来的so文件,因为每种ABI有自己特定的系统特性,在其他关联abi平台上的androidCPU上可能会遇到运行不流畅甚至ANR或者crash的现象。



Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐