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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
|
page.title=Android NDK Native APIs
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>On this page</h2>
<ol>
<li><a href="#purpose">Overview</a></li>
<li><a href="#mnu">Major Native API Updates</a><li>
<ol>
<li><a href="#a3">Android API level 3</a></li>
<li><a href="#a4">Android API level 4</a></li>
<li><a href="#a5">Android API level 5</a></li>
<li><a href="#a8">Android API level 8</a></li>
<li><a href="#a9">Android API level 9</a></li>
<li><a href="#a14">Android API level 14</a></li>
<li><a href="#a18">Android API level 18</a></li>
</ol>
</ol>
</div>
</div>
<p>The Android NDK provides a set of native headers and shared library files that has gradually
increased with successive releases of new Android API levels. This page explains these headers and
files, and maps them to specific
<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels"> Android API levels</a>.
</p>
<h2 id="purpose">Overview</h2>
<p>There are two basic steps to enable your app to use the libraries that the NDK provides:
</p>
<ol type ="1">
<li>Include in your code the headers associated with the libraries you wish to use.</li>
<li>Tell the build system that your native module needs to link against the libraries at load time.
For example, to link against {@code /system/lib/libfoo.so}, add the following line to your
<a href="{@docRoot}ndk/guides/android_mk.html">Android.mk</a> file:</li>
<pre>
LOCAL_LDLIBS := -lfoo
</pre>
<p>To list multiple libraries, use a space as a delimiter. For more information about using the
{@code LOCAL_LDLIBS} variable, see <a href="{@docRoot}ndk/guides/android_mk.html">Android.mk</a>.
</p>
</ol>
<p>For all API levels, the build system automatically links the standard C libraries, the
standard C++ libraries, real-time extensions, and {@code pthread}; you do not need
to include them when defining your {@code LOCAL_LDLIBS} variable. For more information about
the C and C++ libraries, see <a href="#a3">Android API level 3</a>.</p>
<p>The NDK often provides new headers and libraries for new Android releases. These files reside
under {@code $NDK/platforms/android-<level>/<abi>/usr/include}. When the NDK does not
have a specific new group of headers and libraries for an Android API level, it means that
an app targeting that level should use the most recently released NDK assets. For example,
there was no new release of NDK headers or libraries for Android API levels 6 and 7. Therefore,
when developing an app targeting Android API level 7, you should use the headers and libraries
located under {@code android-5/}.</p>
<p>Table 1 shows the correspondence between NDK-supported API levels and Android releases.</p>
<p class="table-caption" id="table1">
<strong>Table 1.</strong> NDK-supported API levels and corresponding Android releases.</p>
<table>
<tr>
<th scope="col">NDK-supported API level</th>
<th scope="col">Android release</th>
</tr>
<tr>
<td>3</td>
<td>1.5</td>
</tr>
<tr>
<td>4</td>
<td>1.6</td>
</tr>
<tr>
<td>5</td>
<td>2.0</td>
</tr>
<tr>
<td>8</td>
<td>2.2</td>
</tr>
<tr>
<td>9</td>
<td>2.3 through 3.0.x</td>
</tr>
<tr>
<td>12</td>
<td>3.1.x</td>
</tr>
<tr>
<td>13</td>
<td>3.2</td>
</tr>
<tr>
<td>14</td>
<td>4.0 through 4.0.2</td>
</tr>
<tr>
<td>15</td>
<td>4.0.3 and 4.0.4</td>
</tr>
<tr>
<td>16</td>
<td>4.1 and 4.1.1</td>
</tr>
<tr>
<td>17</td>
<td>4.2 and 4.2.2</td>
</tr>
<tr>
<td>18</td>
<td>4.3</td>
</tr>
<tr>
<td>19</td>
<td>4.4</td>
</tr>
<tr>
<td>21</td>
<td>4.4W and 5.0</td>
</table>
<p>Each new release of NDK headers and libraries for a given Android API level is cumulative; you
are nearly always safe if you use the most recently released headers when building your app. For
example, you can use the NDK headers for Android API level 21 for an app targeting API level 16. By doing so, however, you increase your APK's footprint.</p>
<p>
For more information about Android API levels, see
<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">What is API Level?</a>.
</p>
<h2 id="mnu">Major Native API Updates</h2>
<h3 id="a3">Android API level 3</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 1.5 system
images and above.</p>
<h4>C library</h4>
<p>The C library headers for Android 1.5 are available through their standard names, such as
{@code stdlib.h} and {@code stdio.h}. If a header is missing at build time, it's because the
header is not available on the 1.5 system image.</p>
<h4>C++ library</h4>
<p>An <em>extremely</em> minimal C++ support API is available. For more
information on C++ library support, see
<a href="{@docRoot}ndk/guides/cpp-support.html">C++ Library Support</a>.</p>
<h4>Android-specific log support</h4>
<p>{@code <android/log.h>} contains various definitions that an app can use to send log
messages to the kernel from native code. For more information about these definitions, see the
comments in {@code $NDK/platforms/android-3/arch-arm/usr/include/android/log.h}, where {@code $NDK}
is the root of your NDK installation.</p>
<p>You can write your own wrapper macros to access this functionality. If you wish to perform
logging, your native module should link to {@code /system/lib/liblog.so}. Implement this
linking by including the following line in your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -llog
</pre>
<h4>ZLib compression library</h4>
<p>You can use the <a href="http://www.zlib.net/manual.html">Zlib compression library</a>
by including {@code zlib.h} and {@code zconf.h}. You must also link your native
module against {@code /system/lib/libz.so} by including the following line in your
<a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -lz
</pre>
<h4>Dynamic linker library</h4>
<p>You can access the Android dynamic linker's {@code dlopen()}, {@code dlsym()}, and
{@code dlclose()} functions by including {@code dlfcn.h}. You must also link against
{@code /system/lib/libdl.so} by including the following line in your
<a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -ldl
</pre>
<h3 id="a4">Android API level 4</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 1.6 system
images and above.</p>
<h4>OpenGL ES 1.x Library</h4>
<p>The standard OpenGL ES headers {@code gl.h} and {@code glext.h} contain
the declarations necessary for performing OpenGL ES 1.x rendering calls from native code.</p>
<p>To use these headers, link your native module to {@code /system/lib/libGLESv1_CM.so} by
including the following line in your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
</p>
<pre>
LOCAL_LDLIBS := -lGLESv1_CM
</pre>
<p>All Android-based devices support OpenGL ES 1.0, because Android provides an Open GL 1.0-capable
software renderer that can be used on devices without GPUs.</p>
<p>Only Android devices that have the necessary GPU fully support OpenGL ES 1.1. An app can
query the OpenGL ES version string and extension string to determine whether the current device
supports the features it needs. For information on how to perform this query, see the description of
<a href="http://www.khronos.org/opengles/sdk/1.1/docs/man/glGetString.xml">{@code glGetString()}</a>
in the OpenGL specification.</p>
<p>Additionally, you must put a
<a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html">{@code
<uses-feature>}</a> tag in your manifest file to indicate the version of
<a href="http://developer.android.com/guide/topics/graphics/opengl.html#manifest">OpenGL ES</a>
that your application requires.</p>
<p>The <a href="#egl">EGL APIs</a> are only available starting from API level 9. You can, however,
use the VM to perform some of the operations that you would get from those APIS. These operations
include surface creation and flipping. For an example of how to use {@code GLSurfaceView}, see
<a href="http://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html">
Introducing GLSurfaceView</a>.</p>
<p>The san-angeles sample application provides an example of how to perform these operations,
rendering each frame in native code. This sample is a small Android port of the excellent
<a href="http://jet.ro/visuals/san-angeles-observation/">San Angeles Observation</a> demo
program.</p>
<h3 id="a5">Android API level 5</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 2.0 system
images and above.</p>
<h4>OpenGL ES 2.0 library:</h4>
<p>The standard OpenGL ES 2.0 headers {@code <GLES2/gl2.h>} and {@code <GLES2/gl2ext.h>}
contain the declarations needed for performing OpenGL ES 2.0 rendering calls from native code.
These rendering calls provide the ability to use the GLSL language to define and use vertex and
fragment shaders.</p>
<p>To use OpenGL ES 2.0, link your native module to {@code /system/lib/libGLESv2.so} by
including the following line in your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -lGLESv2
</pre>
<p>Not all devices support OpenGL ES 2.0. An app can query the OpenGL
ES version string and extension string to determine whether the current device
supports the features it needs. For information on how to perform this query, see the description of
<a href="https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml">
{@code glGetString()}</a> in the OpenGL specification.</p>
<p>Additionally, you must put a
<a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html">{@code
<uses-feature>}</a> tag in your manifest file to indicate which version of OpenGL ES your
application requires. For more information about the OpenGL ES settings for
{@code <uses-feature>}, see
<a href="http://developer.android.com/guide/topics/graphics/opengl.html#manifest">OpenGL ES</a>.</p>
<p>The hello-gl2 sample application provies a basic example of how to use OpenGL ES 2.0 with the
NDK.</p>
<p>The <a href="#egl">EGL APIs</a> are only available starting from API level 9. You can, however,
use the VM to perform some of the operations that you would get from those APIs. These operations
include surface creation and flipping. For an example of how to use {@code GLSurfaceView}, see
<a href="http://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html">
Introducing GLSurfaceView</a>.</p>
<p class="note"><strong>Note:</strong> The Android emulator does not support OpenGL ES 2.0 hardware
emulation. Running and testing code that uses this API requires a real device with hardware that can
support OpenGL ES 2.0.</p>
<h3 id="a8">Android API level 8</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 2.2 system
images and above.</p>
<h4>jnigraphics</h4>
<p>The {@code jnigraphics} library exposes a C-based interface that allows native code to reliably access
the pixel buffers of Java bitmap objects. The workflow for using {@code jnigraphics} is as follows:
</p>
<ol type="1">
<li>Use {@code AndroidBitmap_getInfo()} to retrieve information from JNI, such as width and height,
about a given bitmap handle.</li>
<li>Use {@code AndroidBitmap_lockPixels()} to lock the pixel buffer and retrieve a pointer to it.
Doing so ensures that the pixels do not move until the app calls
{@code AndroidBitmap_unlockPixels()}.</li>
<li>In native code, modify the pixel buffer as appropriate for its pixel format, width, and other
characteristics.</li>
<li>Call {@code AndroidBitmap_unlockPixels()} to unlock the buffer.</li>
</ol>
<p>To use {@code jnigraphics}, include the {@code <bitmap.h>} header in your source code, and
link against {@code jnigraphics} by including the following line in your
<a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS += -ljnigraphics
</pre>
<p>Additional details about this feature are in the comments of the {@code bitmap.h} file.
<h3 id="a9">Android API level 9</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 2.3 system
images and above.</p>
<h4 id="egl"> EGL</h4>
<p>EGL provides a native platform interface for allocating and managing OpenGLES surfaces.
For more information about its features, see <a href="http://www.khronos.org/egl">
EGL Native Platform Interface</a>.</p>
<p>EGL allows you to perform the following operations from native code:</p>
<ul>
<li>List supported EGL configurations.</li>
<li>Allocate and release OpenGLES surfaces.</li>
<li>Swap or flip surfaces.</li>
</ul>
<p>The following headers provide EGL functionality:</p>
<ul>
<li>{@code EGL/egl.h}: the main EGL API definitions.</li>
<li>{@code EGL/eglext.h}: EGL extension-related definitions.</li>
</ul>
<p>To link against the system's EGL library, add the following line to your
<a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS += -lEGL
</pre>
<h4 id="osl">OpenSL ES</h4>
<p>Android native audio handling is based on the Khronos Group OpenSL ES 1.0.1 API.</p>
<p>The standard OpenSL ES headers {@code OpenSLES.h} and {@code OpenSLES_Platform.h} contain
the declarations necessary for performing audio input and output from the native side of Android.
The NDK distribution of the OpenSL ES also provides Android-specific extensions. For information
about these extensions, see the comments in {@code OpenSLES_Android.h} and
{@code OpenSLES_AndroidConfiguration.h}.</p>
<p>The system library {@code libOpenSLES.so} implements the public native audio functions. Link
against it by adding the following line to your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS += -lOpenSLES
</pre>
<p>For more information about the OpenSL ES API, refer to
{@code $NDK/docs/Additional_library_docs/opensles/index.html}, where {@code $NDK} is your NDK
installation root directory.</p>
<h4>Android native application APIs</h4>
<p>Starting from API level 9, you can write an entire Android app with native code, without using
any Java.</p>
<p class="note"><strong>Note: </strong>Writing your app in native code is not, in itself, enough
for your app to run in the VM. Moreover, your app must still access most features of the Android
platform via JNI.</p>
<p>This release provides the following native headers:</p>
<ul>
<li>{@code <native_activity.h>}</li>
<li>{@code <looper.h>}</li>
<li>{@code <input.h>}</li>
<li>{@code <keycodes.h>}</li>
<li>{@code <sensor.h>}</li>
<li>{@code <rect.h>}</li>
<li>{@code <window.h>}</li>
<li>{@code <native_window.h>}</li>
<li>{@code <native_window_jni.h>}</li>
<li>{@code <configuration.h>}</li>
<li>{@code <asset_manager.h>}</li>
<li>{@code <storage_manager.h>}</li>
<li>{@code <obb.h>}</li>
</ul>
<p>For more information about these headers, see the
<a href="{@docRoot}ndk/reference/index.html">NDK API Reference documentation</a>, as well as
the comments in the headers, themselves. Also, for more information about the larger topic of
writing native apps, see <a href="{@docRoot}ndk/guides/concepts.html#naa">
Native Activities and Applications</a>.
<p>When you include one or more of these headers, you must also link against the
{@code libandroid.so} library. To link against {@code libandroid.so}, include the following line in
your <a href="{@docRoot}ndk/guides/android_mk.html"> {@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS += -landroid
</pre>
<h3 id="a14">Android API level 14</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 4.0 system
images and above.</p>
<h4>OpenMAX AL</h4>
<p>Android native multimedia handling is based on Khronos Group OpenMAX AL 1.0.1 API.</p>
<p>The standard OpenMAX AL headers {@code <OMXAL/OpenMAXAL.h>} and
{@code <OMXAL/OpenMAXAL_Platform.h>} contain the declarations necessary for performing
multimedia output from the native side of Android.</p>
<p>The NDK distribution of OpenMAX AL also provides Android-specific extensions. For information
about these extensions, see the comments in {@code OpenMAXAL_Android.h}.</p>
<p>The system library {@code libOpenMAXAL.so} implements the public native multimedia functions.
To link against this library, include the following line in your
<a href="{@docRoot}ndk/guides/android_mk.html"> {@code Android.mk}</a> file:</p>
<pre class="fragment"> LOCAL_LDLIBS += -lOpenMAXAL
</pre><p>For more information about this topic, see {@code $NDK/docs/openmaxal/index.html},
where {@code $NDK} is the root directory of your NDK installation.</p>
<h4>OpenSL ES</h4>
<p>OpenSL ES support for this Android API level adds PCM support. For more information about
OpenSL ES support in the NDK, see <a href="#osl">OpenSL ES</a>.</p>
<h3 id="a18">Android API level 18</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 4.3 system
images and above.</p>
<h4>OpenGL ES 3.0</h4>
<p>The standard OpenGL ES 3.0 headers {@code gl3.h} and {@code gl3ext.h} contain the declarations
needed for performing OpenGL ES 3.0 rendering calls from native code. These rendering calls provide
the ability to use the GLSL language to define and use vertex and fragment shaders.
<p>To use OpenGL ES 3.0, link your native module against {@code /system/lib/libGLESv3.so} by
including the following line in your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -lGLESv3
</pre>
<p>Not all devices support OpenGL ES 3.0. An app can query the OpenGL
ES version string and extension string to determine whether the current device
supports the features it needs. For information on how to perform this query, see the description of
<a href="https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml">
{@code glGetString()}</a> in the OpenGL specification.</p>
<p>Additionally, you must put a
<a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html">{@code
<uses-feature>}</a> tag in your manifest file to indicate which version of OpenGL ES your
application requires. For more information about the OpenGL ES settings for
{@code <uses-feature>}, see
<a href="http://developer.android.com/guide/topics/graphics/opengl.html#manifest">OpenGL ES</a>.</p>
<p>The gles3jni sample application provides a basic example of how to use OpenGL ES 3.0 with the
NDK.</p>
<p class="note"><strong>Note:</strong> The Android emulator does not support OpenGL ES 3.0 hardware
emulation. Running and testing code that uses this API requires a real device with hardware that can
support OpenGL ES 3.0.</p>
<h3 id="a18">Android API level 21</h3>
<p>The NDK provides the following APIs for developing native code that runs on Android 4.3 system
images and above.</p>
<h4>OpenGL ES 3.1</h4>
<p>The standard OpenGL ES 3.1 headers {@code gl31.h} and {@code gl3ext.h} contain the declarations
needed for performing OpenGL ES 3.1 rendering calls from native code. These rendering calls provide
the ability to use the GLSL language to define and use vertex and fragment shaders.
<p>To use OpenGL ES 3.1, link your native module against {@code /system/lib/libGLESv3.so} by
including the following line in your <a href="{@docRoot}ndk/guides/android_mk.html">
{@code Android.mk}</a> file:</p>
<pre>
LOCAL_LDLIBS := -lGLESv3
</pre>
<p>Not all devices support OpenGL ES 3.1. An app can query the OpenGL
ES version string and extension string to determine whether the current device
supports the features it needs. For information on how to perform this query, see the description of
<a href="https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml">
{@code glGetString()}</a> in the OpenGL specification.</p>
<p>Additionally, you must put a
<a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html">{@code
<uses-feature>}</a> tag in your manifest file to indicate which version of OpenGL ES your
application requires. For more information about the OpenGL ES settings for
{@code <uses-feature>}, see
<a href="http://developer.android.com/guide/topics/graphics/opengl.html#manifest">OpenGL ES</a>.</p>
<p>The gles3jni sample application provides a basic example of how to use OpenGL ES 3.1 with the
NDK.</p>
<p class="note"><strong>Note:</strong> The Android emulator does not support OpenGL ES 3.1 hardware
emulation. Running and testing code that uses this API requires a real device with hardware that can
support OpenGL ES 3.1.</p>
|