The ndk-build script builds projects that use the NDK's Make-based build
system. There is more specific documentation for the
Android.mk and
Application.mk configuration used
by ndk-build.
Internals
Running the ndk-build script is equivalent to running the following command:
$GNUMAKE -f <ndk>/build/core/build-local.mk <parameters>
$GNUMAKE points to GNU Make 3.81 or later, and
<ndk> points to your NDK installation directory. You can use
this information to invoke ndk-build from other shell scripts, or even your own
make files.
Invoke from the command line
The ndk-build script lives in the top level NDK installation directory. To run it
from the command line, invoke it while in or under your application project directory.
For example:
$ cd <project> $ <ndk>/ndk-build
In this example, <project> points to your
project’s root directory, and <ndk> is the directory where
you installed the NDK.
Options
All parameters to ndk-build are passed directly to the underlying GNU make
command that runs the NDK build scripts. Combine ndk-build and
options in the form ndk-build <option>. For example:
$ ndk-build clean
The following options are available:
-
clean -
Remove any previously generated binaries.
Note: On Mac OS X, running
ndk-build cleanwith a high number of parallel executions may result in a build error that includes the following message:rm: fts_read: No such file or directory
To avoid this issue, consider not using the
-jNmodifier or selecting a smaller value forN, such as 2. -
V=1 - Launch build, and display build commands.
-
-B - Force a complete rebuild.
-
-B V=1 - Force a complete rebuild, and display build commands.
-
NDK_LOG=1 - Display internal NDK log messages (used for debugging the NDK itself).
-
NDK_DEBUG=1 - Force a debuggable build (see table 1).
-
NDK_DEBUG=0 - Force a release build (see table 1).
-
NDK_HOST_32BIT=1 - Always use the toolchain in 32-bit mode.
-
NDK_APPLICATION_MK=<file> -
Build, using a specific
Application.mkfile pointed to by theNDK_APPLICATION_MKvariable. -
-C <project> -
Build the native code for the project path located at
<project>. Useful if you don't want tocdto it in your terminal.
Debuggable versus release builds
Use the NDK_DEBUG option and, in certain cases,
AndroidManifest.xml to specify debug or release build,
optimization-related behavior, and inclusion of symbols. Table 1 shows the
results of each possible combination of settings.
Table 1. Results of NDK_DEBUG (command line) and
android:debuggable (manifest) combinations.
| Manifest Setting | NDK_DEBUG=0 | NDK_DEBUG=1 | NDK_DEBUG not specified |
|---|---|---|---|
| android:debuggable="true" | Debug; Symbols; Optimized*1 | Debug; Symbols; Not optimized*2 | (same as NDK_DEBUG=1) |
| android:debuggable="false" | Release; Symbols; Optimized | Release; Symbols; Not optimized | Release; No symbols; Optimized*3 |
*2: Default for running
ndk-gdb.*3: Default mode.
Note: `NDK_DEBUG=0` is the equivalent of `APP_OPTIM=release`, and compiles with `-O2`. `NDK_DEBUG=1` is the equivalent of `APP_OPTIM=debug` in `Application.mk`, and compiles with `-O0`. For more information about `APP_OPTIM`, see Application.mk.
The syntax on the command line is, for example:
$ ndk-build NDK_DEBUG=1
Requirements
You need GNU Make 4 to use ndk-build or the NDK in general. The NDK includes its
own copy of GNU Make and will use that unless you've set the $GNUMAKE
environment variable to point to an unsuitable make.
JSON compilation databases
In NDK r18 and newer, ndk-build can generate a JSON compilation database.
You can either use ndk-build compile_commands.json to generate the database
without building your code, or ndk-build GEN_COMPILE_COMMANDS_DB=true if you
want to build and generate the database as a side-effect.