1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
page.title=ndk-build
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>On this page</h2>
<ol>
<li><a href="#int">Internals</a></li>
<li><a href="#ifc">Invoking from the Command Line</a></li>
<li><a href="#ife">Invoking from Eclipse</a></li>
<li><a href="#6432">64-Bit and 32-Bit Toolchains</a></li>
<li><a href="#req">Requirements</a></li>
</ol>
</li>
</ol>
</div>
</div>
<p>The {@code ndk-build} file is a shell script introduced in Android NDK r4. Its purpose
is to invoke the right NDK build script.
<h2 id="int">Internals</h2>
<p>Running the {@code ndk-build} script is equivalent to running the following command:</p>
<pre class="no-pretty-print">
$GNUMAKE -f <ndk>/build/core/build-local.mk
<parameters>
</pre>
<p><code>$GNUMAKE</code> points to GNU Make 3.81 or later, and
<code><ndk></code> 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.</p>
<h2 id="ifc">Invoking from the Command Line</h2>
<p>The {@code 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.
For example: </p>
<pre class="no-pretty-print">
cd <project>
$ <ndk>/ndk-build
</pre>
<p>In this example, <code><project></code> points to your
project’s root directory, and <code><ndk></code> is the directory where
you installed the NDK.</p>
<p><a class="anchor" id="options"></a> </p>
<h3>Options</h3>
<p>All parameters to ndk-build are passed directly to the underlying GNU {@code make}
command that runs the NDK build scripts. Combine <code>ndk-build</code> and
options in the form <code>ndk-build <option></code>. For example: </p>
<pre class="no-pretty-print">
$ ndk-build clean
</pre>
<p>The following options are available:</p>
<dl>
<dt>{@code clean}</dt>
<dd>Remove any previously generated binaries.</dd>
<dt>{@code V=1}</dt>
<dd>Launch build, and display build commands.<dd>
<dt>{@code -B}</dt>
<dd>Force a complete rebuild.</dd>
<dt>{@code -B V=1}</dt>
<dd>Force a complete rebuild, and display build commands.</dd>
<dt>{@code NDK_LOG=1}</dd>
<dd>Display internal NDK log messages (used for debugging the NDK itself).</dd>
<dt>{@code NDK_DEBUG=1}</dt>
<dd>Force a debuggable build (see <a href="#dvr">Table 1</a>).</dd>
<dt>{@code NDK_DEBUG=0}</dt>
<dd>Force a release build (see <a href="#dvr">Table 1</a>).</dd>
<dt>{@code NDK_HOST_32BIT=1}</dt>
<dd>Always use the toolchain in 32-bit mode (see <a href="#6432">64-bit and 32-bit
Toolchains</a>).</dd>
<dt>{@code NDK_APPLICATION_MK=<file>}</dt>
<dd>Build, using a specific <code>Application.mk</code> file pointed to by the
{@code NDK_APPLICATION_MK} variable.</dd>
<dt>{@code -C <project>}</dt>
<dd>Build the native code for the project path located at {@code <project>}. Useful if you
don't want to {@code cd} to it in your terminal.</dd>
</dl>
<h2 id="ife">Invoking from Eclipse</h2>
<p>To build from Eclipse, make sure that you have configured it as described in
<a href="{@docRoot}ndk/guides/setup.html#configure">Setup</a>. If you
wish to build using the default <code>ndk-build</code> command, with no
options, you can just build your project just as you would any Android project.
To get Eclipse to add any of the options described above, follow these steps:</p>
<ol type="1">
<li>In the <em>Project Explorer</em> pane, right-click your project name.</li>
<li>Select <strong>Properties</strong>.</li>
<li>Click <strong>C/C++ Build</strong>.</li>
<li>Under the <em>Builder Settings</em> tab, uncheck <strong>Use default build command</strong>.</li>
<li>In the <em>Build command</em> field, enter the entire build string as if you were typing it on
the command line.</li>
<li>Click <strong>OK</strong>.</li>
</ol>
Figure 1 shows an example of an entered string.<br>
<br>
<img src="./images/NDK_build_string.png"
srcset="./images/NDK_build_string@2x.png 2x"
alt="enter the build string next to 'Build command'"
height="152" width="501">
<p style="clear:both"><b>Figure 1.</b> Specifying a debug build from within
Eclipse</p>
<p><a class="anchor" id="dvr"></a> </p>
<h3>Debuggable versus Release builds</h3>
<p>Use the <code>NDK_DEBUG</code> option and, in certain cases,
{@code 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.</p>
<p><em>Table 1.</em> Results of <code>NDK_DEBUG</code> (command line) and
<code>android:debuggable</code> (manifest) combinations.</p>
<table>
<tr>
<th></th><th>NDK_DEBUG=0 </th><th>NDK_DEBUG=1</th><th>NDK_DEBUG not specified
</th></tr>
<tr>
<td>android:debuggble="true" </td><td>Debug; Symbols; Optimized*1
</td><td>Debug; Symbols; Not optimized*2 </td><td>(same as NDK_DEBUG=1)
</td></tr>
<tr>
<td>android:debuggable="false"</td><td>Release; Symbols; Optimized
</td><td>Release; Symbols; Not optimized</td><td>Release; No symbols;
Optimized*3 </td></tr>
</table>
*1: Useful for profiling.<br>
*2: Default for running <a href="{@docRoot}ndk/guides/ndk-gdb.html">{@code ndk-gdb}</a>.<br>
*3: Default mode.<br>
<br>
<p class="note"><strong>Note:</strong> {@code NDK_DEBUG=0} is the equivalent of
{@code APP_OPTIM=release}, and complies with the GCC {@code -O2} option. {@code NDK_DEBUG=1} is the
equivalent of {@code APP_OPTIM=debug} in {@code Application.mk}, and complies with the GCC
{@code -O0} option. For more information about {@code APP_OPTIM}, see
<a href="{@docRoot}ndk/guides/application_mk.html">Application.mk</a>.</p>
<p>The syntax on the command line is, for example: </p>
<pre class="no-pretty-print">
$ ndk-build NDK_DEBUG=1
</pre>
<p>If you are using build tools from prior to SDK r8, you must also modify your
{@code AndroidManifest.xml} file to specify debug mode. The syntax for doing so resembles the
following:</p>
<pre class="no-pretty-print"><application android:label="@string/app_name"
android:debuggable="true">
</pre>
From SDK r8 onward, you do not need to touch {@code 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 {@code NDK_DEBUG=1}.
<h2 id="6432">64-Bit and 32-Bit Toolchains</h2>
<p>Some toolchains come with both 64-bit and 32-bit versions. For example,
directories {@code <ndk>/toolchain/<name>/prebuilt/} and
{@code <ndk>/prebuilt/} may contain both {@code linux-x86} and
{@code 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 {@code NDK_HOST_32BIT=1} either in your environment or
on the ndk-build command line.</p>
<p>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.</p>
<h2 id="req">Requirements</h2>
<p>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.</p>
<p>If you have GNU Make 3.81 installed, but the default <code>make</code>
command doesn’t launch it, define {@code GNUMAKE} in your environment to point to it
before launching ndk-build. For example: </p>
<pre class="no-pretty-print">
$ export GNUMAKE=/usr/local/bin/gmake
$ ndk-build
</pre>
<p>You can override other host prebuilt tools in {@code $NDK/prebuilt/<OS>/bin/}
with the following environment variables: </p>
<pre class="no-pretty-print">
$ export NDK_HOST_AWK=<path-to-awk>
$ export NDK_HOST_ECHO=<path-to-echo>
$ export NDK_HOST_CMP=<path-to-cmp>
</pre>
|