ndk-build 脚本可构建使用 NDK 基于 Make 的构建系统的项目。ndk-build 所使用的 Android.mk 和 Application.mk 配置有更具体的文档。
内部机制
运行 ndk-build 脚本等同于运行以下命令
$GNUMAKE -f <ndk>/build/core/build-local.mk <parameters>
$GNUMAKE 指向 GNU Make 3.81 或更高版本,而 <ndk> 指向您的 NDK 安装目录。您可以使用此信息从其他 shell 脚本甚至您自己的 make 文件中调用 ndk-build。
从命令行调用
ndk-build 脚本位于 NDK 安装的顶层目录中。要从命令行运行它,请在您的应用项目目录中或其下调用它。例如
$ cd <project> $ <ndk>/ndk-build
在此示例中,<project> 指向您的项目根目录,而 <ndk> 是您安装 NDK 的目录。
选项
ndk-build 的所有参数都直接传递给运行 NDK 构建脚本的基础 GNU make 命令。以 ndk-build <选项> 的形式结合使用 ndk-build 和选项。例如
$ ndk-build clean
提供以下选项
-
clean - 移除所有之前生成的二进制文件。
注意:在 Mac OS X 上,使用大量的并行执行运行
ndk-build clean可能会导致构建错误,其中包含以下消息rm: fts_read: No such file or directory
为避免此问题,请考虑不使用
-jN修饰符或为N选择较小的值(例如 2)。 -
V=1 - 启动构建并显示构建命令。
-
-B - 强制进行完整重建。
-
-B V=1 - 强制进行完整重建并显示构建命令。
-
NDK_LOG=1 - 显示内部 NDK 日志消息(用于调试 NDK 本身)。
-
NDK_DEBUG=1 - 强制进行可调试构建(请参阅表 1)。
-
NDK_DEBUG=0 - 强制进行发布版本构建(请参阅表 1)。
-
NDK_HOST_32BIT=1 - 始终使用 32 位模式的工具链。
-
NDK_APPLICATION_MK=<file> - 使用
NDK_APPLICATION_MK变量指向的特定Application.mk文件进行构建。 -
-C <project> - 为位于
<project>的项目路径构建原生代码。如果您不想在终端中cd到该路径,此选项很有用。
可调试构建与发布构建
使用 NDK_DEBUG 选项,并在某些情况下使用 AndroidManifest.xml 来指定调试或发布构建、与优化相关的行为以及是否包含符号。表 1 显示了每种可能的设置组合的结果。
表 1. NDK_DEBUG(命令行)和 android:debuggable(清单)组合的结果。
| 清单设置 | NDK_DEBUG=0 | NDK_DEBUG=1 | 未指定 NDK_DEBUG |
|---|---|---|---|
| android:debuggable="true" | 调试;包含符号;已优化*1 | 调试;包含符号;未优化*2 | (与 NDK_DEBUG=1 相同) |
| android:debuggable="false" | 发布;包含符号;已优化 | 发布;包含符号;未优化 | 发布;不含符号;已优化*3 |
*2:运行
ndk-gdb 的默认设置。*3:默认模式。
注意:NDK_DEBUG=0 等同于 APP_OPTIM=release,使用 -O2 进行编译。NDK_DEBUG=1 等同于 Application.mk 中的 APP_OPTIM=debug,使用 -O0 进行编译。如需了解有关 APP_OPTIM 的详细信息,请参阅 Application.mk。
例如,命令行上的语法为
$ ndk-build NDK_DEBUG=1
要求
通常情况下,使用 ndk-build 或 NDK 需要 GNU Make 4。NDK 包含其自己的 GNU Make 副本,并且将使用它,除非您已设置 $GNUMAKE 环境变量指向不合适的 make 版本。
JSON 编译数据库
在 NDK r18 及更高版本中,ndk-build 可以生成 JSON 编译数据库。
您可以使用 ndk-build compile_commands.json 生成数据库而不构建您的代码,或者如果您想在构建的同时生成数据库作为副作用,则可以使用 ndk-build GEN_COMPILE_COMMANDS_DB=true。