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的写法

key1 := value1
key2 := value2
key3 := value3

Application.mk文件中里面全都是标签key和值value来定义一些属性的,
所有我们只需要看懂里面标签的意义就知道整个Application.mk的用法了。
比如APP_ABI,是用来确定编译成什么样处理器平台下的so文件。

###1.最简单的文件格式:

#注释:注解*****
APP_ABI := arm64-v8a
APP_PLATFORM := android-21

####(1) 上面的#是用来注释的,//双斜杠在mk文件中是不能用作于注释的。
####(2) 0APP_ABI :=后面接的是需要生成的.so平台文件,正常手机使用arm64处理器的即可。
####(3) 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不带调试信息

正常情况不用写这个属性就可以了,如果需要进行断点调试的情况可以设置为debug。

##三.其他

对于Android系统框架的源码中,还会有Android.mk,但是Application.mk是没有的,
所以系统源码中的mk文件是会复制一点的,并且还有其他mk(makefile)文件

#共勉:少年回头望,笑我还不快跟上!

发布了365 篇原创文章 · 获赞 1587 · 访问量 160万+

猜你喜欢

转载自blog.csdn.net/wenzhi20102321/article/details/87909907