ndk-build 脚本

The ndk-build 脚本构建使用 NDK 的基于 Make 的构建系统的项目。对于 Android.mkApplication.mk 配置,ndk-build 使用的配置有更具体的文档。

内部结构

运行 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 <option> 的形式。例如

$ 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=0NDK_DEBUG=1未指定 NDK_DEBUG
android:debuggable="true"调试;符号;优化*1调试;符号;未优化*2(与 NDK_DEBUG=1 相同)
android:debuggable="false"发布;符号;优化发布;符号;未优化发布;无符号;优化*3
*1: 有助于分析。
*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

需求

您需要 GNU Make 4 才能使用 ndk-build 或 NDK。NDK 包含其自身的 GNU Make 副本,除非您已将 $GNUMAKE 环境变量设置为指向不合适的 make,否则它将使用该副本。

JSON 编译数据库

在 NDK r18 及更高版本中,ndk-build 可以生成 JSON 编译数据库

您可以使用 ndk-build compile_commands.json 生成数据库而不构建代码,或者使用 ndk-build GEN_COMPILE_COMMANDS_DB=true 在构建时生成数据库作为副作用。