Application.mk 详解
Application.mk详解
一.Application.mk简介
要将C\C++代码编译为SO文件,光有Android.mk文件还不行,还需要一个Application.mk文件。
本文将对Application.mk进行非常详细介绍。
1.作用
Application.mk是用来确定一些编译规则的,
它规定的不是某一个文件某一行代码,而是所有文件相关
2.存放位置
Application.mk和Android.mk是放在同一个目录下的。
一般是放在src/main/jni/下
jni是新建的文件夹,用于存放C/C++相关的代码
jni文件夹和java文件夹是同级目录,
如果生成的.so也是在/main下创建文件夹jniLibs,把.so放在jniLibs文件夹下
二.Application.mk写法用法
Application.mk的写法
key := value
Application.mk文件中里面全都是标签key和值value来定义一些属性的,
所有我们只需要看懂里面标签的意义就知道整个Application.mk的用法了。
比如APP_ABI,是用来确定编译成什么样处理器平台下的so文件。
1.最简单的文件格式:
#注释:注解*****
APP_ABI := arm64-v8a
APP_PLATFORM := android-21
- 1.上面的#是用来注释的,//双斜杠在mk文件中是不能用作于注释的。
- 0APP_ABI :=后面接的是需要生成的.so平台文件,正常手机使用arm64处理器的即可。
- APP_PLATFORM :=后面接的是使用SDK的最低等级
2.Application.mk的所有标签详解
标签书写顺序没有严格定义(随意就好)。
(1)APP_PLATFORM(必选项)
作用:定义使用的ndk库函数版本号。
属性值可以是: android-,其中是ndk的版本。
一般和SDK的版本(minSdkVersion 21)相对应,NDK版本的各个版本在NDK目录(sdk\ndk-bundle\)下的platforms文件夹中
(2)APP_ABI (必选项)
作用:编译成什么类型的cpu的so,
拥有三个属性值armeabi armeabi-v7a x86,可以只用一个,也可以可以全选,如果全选也可以使用all.
写法可以是:
中间要变成的多个so版本用空格间隔开即可
生成两种格式
APP_ABI := armeabi-v7a arm64-v8a
或者
APP_ABI := all
关于三种cpu处理器的介绍:
目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。
如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。
armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。
x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。
关于使用哪种cup的问题
如果功能简单,并且希望自己的apk小一点,编一个x86版本的so即可。
如果想为了适应所有机型可以添加一下armeabi-v7a的版本。
一般来说正常手机使用x86版本的即可,
对于模拟器的话,就要看创建模拟器设置的cpu类型了。如果不确定模拟器的cpu类型,就生成多个so库即可。
(3)APP_STL (非必选项)
作用:如何连接c++标准库 。
属性值:
stlport_static 静态链接
stlport_shared 动态链接
system 系统默认
如果生成的so库包含静态.a文件,这个属性要写成stlport_static,否则可以不用写。
(4)APP_OPTIM (非必选项)
编译版本,如果是DEBUG版本就会带上调试信息。可以使用gdb-server进行动态断点低调试。
debug 调试版本 so中带调试信息,
release(默认) 发布版本 so不带调试信息