ndk-build file is a shell script introduced in Android NDK r4. Its purpose
is to invoke the right NDK build script.
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
Invoking from the Command Line
ndk-build file lives in the top level the NDK installation directory. To run it
from the command line, invoke it while in or under your application project directory.
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.
All parameters to ndk-build are passed directly to the underlying GNU
command that runs the NDK build scripts. Combine
options in the form
ndk-build <option>. For example:
$ ndk-build clean
The following options are available:
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 for
N, such as 2.
- Launch build, and display build commands.
- Force a complete rebuild.
- Force a complete rebuild, and display build commands.
- Display internal NDK log messages (used for debugging the NDK itself).
- Force a debuggable build (see table 1).
- Force a release build (see table 1).
- Always use the toolchain in 32-bit mode (see 64-bit and 32-bit Toolchains).
Build, using a specific
Application.mkfile pointed to by the
Build the native code for the project path located at
<project>. Useful if you don't want to
cdto it in your terminal.
Debuggable versus Release builds
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.
|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|
*1: Useful for profiling.
*2: Default for running
*3: Default mode.
NDK_DEBUG=0 is the equivalent of
APP_OPTIM=release, and complies with the GCC
NDK_DEBUG=1 is the
Application.mk, and complies with the GCC
-O0 option. For more information about
The syntax on the command line is, for example:
$ ndk-build NDK_DEBUG=1
If you are using build tools from prior to SDK r8, you must also modify your
AndroidManifest.xml file to specify debug mode. The syntax for doing so resembles the
<application android:label="@string/app_name" android:debuggable="true">
From SDK r8 onward, you do not need to touch
AndroidManifest.xml. Building a debug package
(e.g. with ant debug or the corresponding option of the ADT plugin) causes the tool automatically to
pick the native debug files generated with
64-Bit and 32-Bit Toolchains
Some toolchains come with both 64-bit and 32-bit versions. For example,
<ndk>/prebuilt/ may contain both
linux-x86_64 folders for Linux tools in 32-bit and 64-bit modes,
respectively. The ndk-build script automatically chooses a 64-bit version of
the toolchain if the host OS supports it. You can force the use of a 32-bit
toolchain by using
NDK_HOST_32BIT=1 either in your environment or
on the ndk-build command line.
Note that 64-bit tools utilize host resources better (for instance, they are faster, and handle larger programs), and they can still generate 32-bit binaries for Android.
You need GNU Make 3.81 or later to use ndk-build or the NDK in general. The build scripts will detect a non-compliant Make tool, and generate an error message.
If you have GNU Make 3.81 installed, but the default
command doesn’t launch it, define
GNUMAKE in your environment to point to it
before launching ndk-build. For example:
$ export GNUMAKE=/usr/local/bin/gmake $ ndk-build
You can override other host prebuilt tools in
with the following environment variables:
$ export NDK_HOST_AWK=<path-to-awk> $ export NDK_HOST_ECHO=<path-to-echo> $ export NDK_HOST_CMP=<path-to-cmp>