做者:阿宝
更新:2016-08-31
来源:彩色世界(https://blog.hz601.org/2016/07/26/android-NDK-application-mk/index.html) html
英文原版: Android NDK Application.mkandroid
Application.mk文件用来讲明一款APP依赖于哪些本地模块。本地模块能够是静态连接库,动态连接库,或者可执行文件。c++
注: 咱们强烈建议你在阅读本文以前,先阅读 Android.mk,以便更好的理解。api
Application.mk文件是一个迷你的GNU Makefile片断,用来定义一些编译变量。Application.mk文件通常放在$PROJECT/jni/目录下,其中$PROJECT表明项目目录。也能够把文件放在$NDK/app/
$NDK/apps/<myapp>/Application.mk
此变量值必须是项目根目录的绝对路径。用于指定JNI生成的.so文件的安装路径或拷贝路径。
注:此变量对于概述中的第一种方法是可选的,但对于第二种方法倒是必须的。ide
可选值为 release 或 debug。用来设置编译器的编译优化级别。优化
默认为 release 模式,用于生成优化过的二进制机器码。debug 模式用于生成未优化的二进制机器码,方便调试错误。ui
不管在哪一种模式下,均可以进行调试。不一样的是在release模式下调试器可提供的信息更少。好比,一些被优化过的变量,是没法用于检查,单步调试,或者跟踪的。debug
若是在项目的manifest文件中声明了 android:debuggable 标签,那么Apllication.mk文件中此变量的默认值被修改成 debug。你也能够在Apllication.mk文件中设置此变量来覆盖manifest文件中的设置。调试
此变量用来指定编译C/C++代码的编译选项。当你须要修改某个指定模块的编译参数时,能够修改此变量,而没必要去修改Android.mk文件。
此变量中涉及到的文件路径,可使用相对路径(相对于NDK根目录),或绝对路径。例如
sources/foo/Android.mk sources/bar/Android.mk
若是你想要在编译模块时把bar目录添加进foo/Android.mk文件中,能够这样作:
APP_CFLAGS += -Isources/bar
或者这样:
APP_CFLAGS += -I$(LOCAL_PATH)/../bar
注意,不能使用 -I../bar 这样的方式,由于它会被编译器解析为 -I$NDK_ROOT/../bar,这明显不是咱们想要的结果。
注: 在android-ndk-1.5_r1版本中,此变量只能用于C代码。以后的版本中C/C++都是支持的。
此变量用来指定编译C++代码的编译选项。
注: 在android-ndk-1.5_r1版本中,此变量同时适用于C和C++代码。以后的版本中只支持C++代码。若是要同时支持C/C++代码,可使用APP_CFLAGS变量。
此变量用来指定生成应用时使用到的连接选项。此选项用于编译动态连接库和可运行程序,当编译静态连接库时,此选项被忽略。
此变量用来指定NDK编译脚本,默认为jni/Android.mk。可使用相对路径(相对于NDK根目录),或绝对路径。
默认状况下,NDK会使用'armeabi' ABI来生成二进制机器码,这是基于ARMv5TE并支持浮点运算的机器码。可使用此变量来指定不一样的ABI。下表中列出了适用于不一样指令集的 ABI 选项。
表1:不一样指令集下的 APP_ABI 设置
指令集 | 取值 |
---|---|
支持基于armv7 FPU指令集的设备 | APP_ABI := armeabi-v7a |
ARMv8 AArch64 | APP_ABI := x86 |
IA-32 | APP_ABI := x86 |
Intel64 | APP_ABI := x86_64 |
MIPS32 | APP_ABI := mips |
MIPS64 (r6) | APP_ABI := mips64 |
支持全部指令集 | APP_ABI := all |
注: 从NDKr7开始支持all取值。
你能够同时指定多个取值,取值之间使用空格分隔。例如
APP_ABI := armeabi armeabi-v7a x86 mips
有关可用的ABI列表,信息,及使用限制,参考这里ABI Management。
此变量用来指定目标Android平台的名称。例如'android-3'表明了Android 1.5系统。完整的Android平台名称及系统版本参见Android NDK Native APIs。
默认状况下,NDK经过Androoid自带的迷你C++运行库(system/lib/libstdc++.so)来提供标准C++头文件。另外,NDK提供了可供选择的C++实现,你能够经过此变量来指定在程序内使用或连接的C++库。更多有关支持的C++库和特性参见这里NDK Runtimes and Features。
此变量用来给全部的模块设置LOCAL_SHORT_COMMANDS选项。更详细的说明查看 Android.mk 的LOCAL_SHORT_COMMANDS选项。
此变量用来指定编译器(默认为GCC)的版本。64位ABI默认GCC版本为4.9,32位默认为4.8。若是使用Clang编译器,可选值为clang3.4 或 clang3.5 或 clang。clang表示使用最新版本。
安卓动态连接器,从4.1系统(API 16)开始支持基于位置的可执行程序(PIE)特性。从5.0系统(API 21)开始,可执行程序依赖于PIE特性。经过设置-fPIE选项来编译支持PIE的可执行程序。糟糕的是,这个选项会让随机代码位置引发的内存泄露的分析变得更加困难。
若是项目目标为SDK 16或以上版本,ndk-build会默认启用此选项。固然你也能够设置为false来禁用此选项。
此选项仅对可执行程序有效。换句话说,在编译动/静态库时使用无任何效果。
注: 此选项不支持安卓4.1之前的系统。
此选项用来给全部的模块设置LOCAL_THIN_ARCHIVE默认值。更多信息请查看Android.mk的LOCAL_THIN_ARCHIVE选项。