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 <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 位模式下的工具链(详见 64 位和 32 位工具链)。
-
NDK_APPLICATION_MK=<file>
-
使用
NDK_APPLICATION_MK
变量指向的特定Application.mk
文件进行编译。 -
-C <project>
-
编译位于
<project>
的项目路径的原生代码。如果您不想在终端通过cd
切换到该路径,此选项会非常有用。
可调试版编译与发布版编译
使用 NDK_DEBUG
选项,并在特定情况下通过 AndroidManifest.xml
指定调试版或发布版编译、优化相关行为以及是否包含符号。表 1 显示了每个可能的设置组合的结果。
*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
64 位和 32 位工具链
某些工具链同时随附了 64 位和 32 位版本。例如,目录 <ndk>/toolchain/<name>/prebuilt/
和 <ndk>/prebuilt/
可能同时包含 linux-x86
和 linux-x86_64
文件夹,以分别用于 32 位和 64 位模式下的 Linux 工具。ndk-build 脚本会自动选择工具链的 64 位版本(如果主机操作系统支持的话)。您可以通过在自己的环境或 ndk-build 命令行中使用 NDK_HOST_32BIT=1
来强制使用 32 位工具链。
请注意,64 位工具可以更好地利用主机资源(例如,它们速度更快,并且可处理更大的程序),同时它们仍可以生成 32 位 Android 二进制文件。
要求
通常,您需要安装 GNU Make 3.81 或更高版本才能使用 ndk-build 或 NDK。编译脚本将检测不合规的 Make 工具,并生成错误消息。
如果您已安装 GNU Make 3.81,但默认的 make
命令不启动它,请在您的环境中定义 GNUMAKE
,以便在启动 ndk-build 之前指向它。例如:
$ export GNUMAKE=/usr/local/bin/gmake $ ndk-build
您可以将 $NDK/prebuilt/<OS>/bin/
中的其他主机预编译工具替换为下列环境变量:
$ export NDK_HOST_AWK=<path-to-awk> $ export NDK_HOST_ECHO=<path-to-echo> $ export NDK_HOST_CMP=<path-to-cmp>