Application.mk 详解

2020-04-06  本文已影响0人  差点长成一枚帅哥

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

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不带调试信息

上一篇下一篇

猜你喜欢

热点阅读