Android之JNI NDK ABI简要说明

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的现象。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值