Note: these obsolete versions of the NDK are no longer supported. Use a current release instead.
r24
r24 Changelog
android { ndkVersion "24.0.8215888" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| macOS | android-ndk-r24-darwin.dmg | 1465702648 | a04581fe13173ea731168c6a1e73390ab628d1aa |
| Linux | android-ndk-r24-linux.zip | 667731974 | eceb18f147282eb93615eff1ad84a9d3962fbb31 |
| Windows | android-ndk-r24-windows.zip | 663076813 | 75f9c281c64762d18c84da465f486c60def47829 |
r23c
r23 Changelog
android { ndkVersion "23.2.8568313" }
| Platform | Package | Size (Bytes) | SHA1 Checksum |
|---|---|---|---|
| Windows | android-ndk-r23c-windows.zip | 788336993 | f2c5def76a9de371f27d028864fe301ab4fe0cf8 |
| macOS | android-ndk-r23c-darwin.dmg | 1542594243 | da6f63d3eef041e1cceca449461c6d9148e879b7 |
| Linux | android-ndk-r23c-linux.zip | 724733960 | e5053c126a47e84726d9f7173a04686a71f9a67a |
r22b
r22 Changelog
android { ndkVersion "22.1.7171670" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| macOS App Bundle | android-ndk-r22-darwin-x86_64.dmg | 1212443975 | ecd9ce035394e227cba741f48732661055caa251 |
| macOS | android-ndk-r22b-darwin-x86_64.zip | 1049337733 | dc80e8a2cfcb28db74c1931d42c652e9d17ff2c3 |
| Linux | android-ndk-r22b-linux-x86_64.zip | 1148198368 | 9ece64c7f19763dd67320d512794969930fce9dc |
| Windows | android-ndk-r22b-windows-x86_64.zip | 1082301775 | 96ba1a049303cf6bf3ee84cfd64d6bcd43486a50 |
r21e
r21 Changelog
android { ndkVersion "21.4.7075529" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r21e-linux-x86_64.zip | 1190670072 | c3ebc83c96a4d7f539bd72c241b2be9dcd29bda9 |
| Mac OS X | android-ndk-r21-darwin-x86_64.dmg | 1258923497 | d8ab6d1ebb5499a3604db4134372bfbaff96a94e |
| Mac OS X | android-ndk-r21e-darwin-x86_64.zip | 1042617180 | 3f15c23a1c247ad17c7c271806848dbd40434738 |
| Windows 64-bit | android-ndk-r21e-windows-x86_64.zip | 1109665123 | fc44fea8bb3f5a6789821f40f41dce2d2cd5dc30 |
r20b
r20 Changelog
android { ndkVersion "20.1.5948944" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r20b-linux-x86_64.zip | 859780564 | d903fdf077039ad9331fb6c3bee78aa46d45527b |
| Mac OS X | android-ndk-r20b-darwin-x86_64.zip | 843201217 | b51290ab69cb89de1f0ba108702277bc333b38be |
| Windows 32-bit | android-ndk-r20b-windows-x86.zip | 814464692 | 71a1ba20475da1d83b0f1a1826813008f628d59b |
| Windows 64-bit | android-ndk-r20b-windows-x86_64.zip | 832473103 | ead0846608040b8344ad2bc9bc721b88cf13fb8d |
r19c
r19c Changelog
android { ndkVersion "19.2.5345600" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r19c-linux-x86_64.zip | 823376982 | fd94d0be6017c6acbd193eb95e09cf4b6f61b834 |
| Mac | android-ndk-r19c-darwin-x86_64.zip | 807630656 | f46b8193109bba8a58e0461c1a48f4534051fb25 |
| Windows 32-bit | android-ndk-r19c-windows-x86.zip | 778598286 | 132cc0c9e31b9e58ad6505b0816ff9e524422ed2 |
| Windows 64-bit | android-ndk-r19c-windows-x86_64.zip | 796051997 | c4cd8c0b6e7618ca0a871a5f24102e40c239f6a3 |
r18b
r18 Changelog
android { ndkVersion "18.1.5063045" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r18b-linux-x86_64.zip | 557038702 | 500679655da3a86aecf67007e8ab230ea9b4dd7b |
| Mac | android-ndk-r18b-darwin-x86_64.zip | 542911996 | 98cb9909aa8c2dab32db188bbdc3ac6207e09440 |
| Windows 32-bit | android-ndk-r18b-windows-x86.zip | 504605336 | 4b8b6a4edc0fa967b429c1d6d25adf69acc28803 |
| Windows 64-bit | android-ndk-r18b-windows-x86_64.zip | 522489470 | 6b6d4138aaaad7166679fdfa4780e177f95cee6f |
r17c
r17c Changelog
android { ndkVersion "17.2.4988734" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r17c-linux-x86_64.zip | 709387703 | 12cacc70c3fd2f40574015631c00f41fb8a39048 |
| Mac | android-ndk-r17c-darwin-x86_64.zip | 675091485 | f97e3d7711497e3b4faf9e7b3fa0f0da90bb649c |
| Windows 32-bit | android-ndk-r17c-windows-x86.zip | 608358310 | 5bb25bf13fa494ee6c3433474c7aa90009f9f6a9 |
| Windows 64-bit | android-ndk-r17c-windows-x86_64.zip | 650626501 | 3e3b8d1650f9d297d130be2b342db956003f5992 |
r16b
r16b Changelog
android { ndkVersion "16.1.4479499" }
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r16b-linux-x86_64.zip | 852525873 | 42aa43aae89a50d1c66c3f9fdecd676936da6128 |
| Mac | android-ndk-r16b-darwin-x86_64.zip | 839630771 | e51e615449b98c716cf912057e2682e75d55e2de |
| Windows 32-bit | android-ndk-r16b-windows-x86.zip | 656720029 | becaf3d445a4877ca1a9300a62f0934a4838c7fa |
| Windows 64-bit | android-ndk-r16b-windows-x86_64.zip | 723301086 | f3f1909ed1052e98dda2c79d11c22f3da28daf25 |
r15c
r15c Changelog
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r15c-linux-x86_64.zip | 974976754 | 0bf02d4e8b85fd770fd7b9b2cdec57f9441f27a2 |
| Mac | android-ndk-r15c-darwin-x86_64.zip | 960251267 | ea4b5d76475db84745aa8828000d009625fc1f98 |
| Windows 32-bit | android-ndk-r15c-windows-x86.zip | 784778144 | f2e47121feb73ec34ced5e947cbf1adc6b56246e |
| Windows 64-bit | android-ndk-r15c-windows-x86_64.zip | 849733996 | 970bb2496de0eada74674bb1b06d79165f725696 |
r14b
r14b Changelog
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r14b-linux-x86_64.zip | 840626594 | becd161da6ed9a823e25be5c02955d9cbca1dbeb |
| Mac | android-ndk-r14b-darwin-x86_64.zip | 824705073 | 2bf582c43f6da16416e66203d158a6dfaba4277c |
| Windows 32-bit | android-ndk-r14b-windows-x86.zip | 707533928 | 070443eaa7fa37ed337f91c655e02ca708d37c92 |
| Windows 64-bit | android-ndk-r14b-windows-x86_64.zip | 769151176 | a625e8c599bccdb9061b61dcf3d1f1a01071613f |
r13b
r13 Changelog
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r13b-linux-x86_64.zip | 687311866 | 0600157c4ddf50ec15b8a037cfc474143f718fd0 |
| Mac | android-ndk-r13b-darwin-x86_64.zip | 665967997 | 71fe653a7bf5db08c3af154735b6ccbc12f0add5 |
| Windows 32-bit | android-ndk-r13b-windows-x86.zip | 620461544 | 4eb1288b1d4134a9d6474eb247f0448808d52408 |
| Windows 64-bit | android-ndk-r13b-windows-x86_64.zip | 681320123 | 649d306559435c244cec5881b880318bb3dee53a |
r12b
r12b Changelog
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r12b-linux-x86_64.zip | 755551010 | 170a119bfa0f0ce5dc932405eaa3a7cc61b27694 |
| Mac | android-ndk-r12b-darwin-x86_64.zip | 734135279 | e257fe12f8947be9f79c10c3fffe87fb9406118a |
| Windows 32-bit | android-ndk-r12b-windows-x86.zip | 706453972 | 8e6eef0091dac2f3c7a1ecbb7070d4fa22212c04 |
| Windows 64-bit | android-ndk-r12b-windows-x86_64.zip | 749567353 | 337746d8579a1c65e8a69bf9cbdc9849bcacf7f5 |
r11c
r11c Changelog
| Platform | Package | Size (bytes) | SHA1 Checksum |
|---|---|---|---|
| Linux | android-ndk-r11c-linux-x86_64.zip | 794135138 | de5ce9bddeee16fb6af2b9117e9566352aa7e279 |
| Mac | android-ndk-r11c-darwin-x86_64.zip | 772428792 | 4ce8e7ed8dfe08c5fe58aedf7f46be2a97564696 |
| Windows 32-bit | android-ndk-r11c-windows-x86.zip | 728899082 | ff939bde6cd374eecbd2c3b2ad218697f9a5038c |
| Windows 64-bit | android-ndk-r11c-windows-x86_64.zip | 771407642 | 3d89deb97b3191c7e5555f1313ad35059479f071 |
r10e
- Darwin: https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip
- Linux: https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
- Windows: https://dl.google.com/android/repository/android-ndk-r10e-windows-x86_64.zip
r9d
- Darwin: https://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
- Linux: https://dl.google.com/android/ndk/android-ndk-r9d-linux-x86_64.tar.bz2
- Windows: https://dl.google.com/android/ndk/android-ndk-r9d-windows-x86_64.zip
| Platform | Package | Size (Bytes) | MD5 Checksum |
|---|---|---|---|
| Windows 32-bit | android-ndk-r10d-windows-x86.exe | 455427281 | c0930abfae0c990c4d191cc4ebd46b68 |
| Windows 64-bit | android-ndk-r10d-windows-x86_64.exe | 472613732 | 9a33f96da58a7e0b70e47d27b4a880b4 |
| Mac OS X 32-bit | android-ndk-r10d-darwin-x86.bin | 441545213 | 0aeb3dc062dc457a4cd01e72eadb2379 |
| Mac OS X 64-bit | android-ndk-r10d-darwin-x86_64.bin | 442691567 | cb101e1e62d56ea75b215f6bc6c27fae |
| Linux 32-bit (x86) | android-ndk-r10d-linux-x86.bin | 449997190 | 70ed6d8c34e7e620c145b791e8eeef89 |
| Linux 64-bit (x86) | android-ndk-r10d-linux-x86_64.bin | 459151600 | 263b83071e6bca15f67898548d8d236e |
In this document
- Downloads
- Revisions
- System and Software Requirements
- Installing the NDK
- Getting Started with the NDK
- Using the NDK
- Contents of the NDK
- Development tools
- Documentation
- Sample apps
The NDK is a toolset that allows you to implement parts
of your app using native-code languages such as C and C++. For certain types of apps,
this can be helpful so you can reuse existing code libraries written in these
languages, but most apps do not need the Android NDK.
Before downloading the NDK, you should understand that the NDK
will not benefit most apps. As a developer, you need to balance its benefits
against its drawbacks. Notably, using native code on Android
generally does not result in a noticable performance improvement,
but it always increases your app complexity. In general, you should only use the NDK
if it is essential to your app—never because you simply prefer to program in C/C++.
Typical good candidates for the NDK are CPU-intensive workloads such as game engines,
signal processing, physics simulation, and so on. When examining
whether or not you should develop in native code, think about your requirements and see if the
Android framework APIs provide the functionality that you need.
Downloads
Revisions
The following sections provide information about releases of the NDK.

- Important changes:
-
- Made GCC 4.8 the default for all 32-bit ABIs. Deprecated GCC 4.6, and
will remove it next release. To restore previous behavior, either add
NDK_TOOLCHAIN_VERSION=4.6to ndk-build, or
add--toolchain=arm-linux-androideabi-4.6when executing
make-standalone-toolchain.shon the command line. GCC 4.9 remains the
default for 64-bit ABIs. - Stopped all x86[_64] toolchains from adding
-mstackrealignby default. The
NDK toolchain assumes a 16-byte stack alignment. The tools and options used by default
enforce this rule. A user writing assembly code must make sure to preserve stack
alignment, and ensure that other compilers also comply with this rule.
(GCC bug 38496) - Added Address Sanitizer functionality to Clang 3.5 support to the ARM and x86 ABIs.
For more information on this change, see the
Address
Sanitizer project. - Introduced the requirement, starting from API level 21, to use
-fPIE -piewhen building. In API levels 16 and higher, ndk-build uses
PIE
when building. This change has a number of implications, which are discussed inDeveloper Preview Issue 888.
These implications do not apply to shared libraries.
- Made GCC 4.8 the default for all 32-bit ABIs. Deprecated GCC 4.6, and
- Important bug fixes:
-
- Made more fixes related to
A53 Errata #835769 in the aarch64-linux-android-4.9 linker. As part of this, GCC
passes a new option,--fix-cortex-a53-835769, when
-mfix-cortex-a53-835769(enabled by default) is specified.
For more information, see this
binutils message
and this
binutils message. - Documented a fix to a libc++
sscanf/vsscanfhang that occurred in API level
21. The fix itself had been implemented in r10c.
(Issue 77988) - Fixed an AutoFDO (
-fauto-profile) crash that occurred with GCC 4.9 when
-Oswas specified. (Issue 77571)
- Made more fixes related to
- Other bug fixes:
-
- Made the following header and library fixes:
- Added
posix_memalignto API level 16. Also, added a prototype in
stdlib.hto API levels 16 to 19.
(Issue 77861) - Fixed
stdatomic.hso that it includes<atomic>only for
C++11. - Modified the following headers for standalone use:
sys/user.h, and
gl2ext.h,dlext.h,fts.h,sgidefs.h
for API level 21. - Modified
sys/user.hto renamemxcsr_maskasmxcr_mask,
and to change the data type foru_ar0 - Changed
sysconf()return value type fromintto
long. - Fixed ndk-build’s handling of
thumbforLOCAL_ARM_MODE: In
r10d, ndk-build addsLOCAL_LDFLAGS+=-mthumbby default, unless one of the
following conditions applies: - You have set
LOCAL_ARM_MODEequal toarm. - You are doing a debug build (with settings such as
APP_OPTIM=debugand
AndroidManifest.xmlcontainingandroid:debuggable="true"),
where ARM mode is the default in order to retain compatibility with earlier toolchains.
(Issue 74040) - Fixed
LOCAL_SRC_FILESin ndk-build to use Windows absolute paths.
(Issue 74333) - Removed bash-specific code from ndk-gdb. (Issue 73338)
- Removed bash-specific code from
make-standalone-toolchain.sh.
(Issue 74145) - Revised documentation concerning a fix for
System.loadLibrary()transitive
dependencies. (Issue 41790) - Fixed a problem that was preventing 64-bit packages from extracting on Ubuntu 14.04 and
OS X 10.10 (Yosemite). (Issue 78148) - Fixed an issue with
LOCAL_PCHto improve Clang support. (Issue
77575) - Clarified «requires executable stack» warning from ld.gold. (Issue
79115)
from
unsigned long
to struct user_regs_struct*.

- Important changes:
-
- Made the following changes to download structure:
- Each package now contains both the 32- and the 64-bit headers, libraries, and tools for
its respective platform. - STL libraries with debugging info no longer need be downloaded separately.
- Changed everything previously called
Android-Lto the official release
designation:android-21. - Updated GCC 4.9 by rebasing to the
googlebranch
of the GCC repository. Major differences from the upstream version of GCC 4.9 include: - The
-O2option now turns on vectorization, without loop peeling but with more
aggressive unrolling. - Enhancements to FDO and
LIPO - Added Clang 3.5 support to all hosts:
NDK_TOOLCHAIN_VERSION=clang
now picks Clang 3.5. Note that: - ARM and x86 default to using the integrated assembler. If this causes issues, use
-fno-integrated-asas a workaround. - Clang 3.5 issues more warnings for unused flags, such as the
-finline-functions
option that GCC supports. - Made it possible to enter ART debugging mode, when debugging on an Android 5.0 device using
ART as its virtual machine, by specifying theart-onoption. For more information,
seeprebuilt/common/gdb/common.setupin the directory containing the NDK. - Removed support for Clang 3.3.
- Deprecated GCC 4.6, and may remove it from future releases.
- Updated mclinker to 2.8 with Identical Code Folding («ICF») support. Specify ICF using the
--icfoption. - Broadened
arm_neon.hsupport in x86 and x86_64, attaining coverage of ~93% of
NEON intrinsics. For more information about NEON support:- Navigate to the NDK Programmer’s Guide (
docs/Programmers_Guide/html/), and see
Architectures and CPUs > Neon. - Examine the updated
hello-neonsample insamples/. - See Intel’s guide to porting from ARM NEON to Intel SSE.
- Navigate to the NDK Programmer’s Guide (
- Documented support for
_FORTIFY_SOURCEinheaders/libs/android-21,
which appeared in r10 (whenandroid-21was still calledAndroid-L),
but had no documentation.
For more detailed information, see Important bug fixes below.
When migrating from projects using GCC, you can use
-Wno-invalid-command-line-argumentand-Wno-unused-command-line-argument
to ignore the unused flags until you’re able decide on what to do with them longer-term. - Important bug fixes:
-
- Fixed an internal compiler error with GCC4.9/aarch64 that was causing the following
error message (Issue 77564):
internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
- Fixed incorrect code generation from GCC4.9/arm. (Issue
77567)- Fixed an internal compiler error with GCC4.9/mips involving inline-assembly. (Issue
77568)- Fixed incorrect code that GCC4.9/arm was generating for
x = (cond) ? y : x.
(Issue 77569)- Fixed GCC4.9/aarch64 and Clang3.5/aarch64 to work around the
Cortex-A53 erratum (835769) by default. Disable the workaround by specifying
-mno-fix-cortex-a53-835769. - Fixed an internal compiler error with GCC4.9/aarch64 that was causing the following
- Other bug fixes:
-
- Made the following header and library fixes to
android-21:- Added more TV keycodes:
android/keycodes.h - Added more constants and six new sensor functions to
android/sensor.h:
ASensorManager_getDefaultSensorEx,ASensor_getFifoMaxEventCount,
ASensor_getFifoReservedEventCount,ASensor_getStringType,
ASensor_getReportingMode, andASensor_isWakeUpSensor. - Fixed
stdatomic.hto improve compatibility with GCC 4.6, and provide support
for the<atomic>header. - Added
sys/ucontext.handsys/user.hto all API levels. The
signal.hheader now includes<sys/ucontext.h>. You may
remove any existing definition ofstruct ucontext. - Added
posix_memalignto API levels 17, 18, and 19. - Added the following functions to all architectures:
android_set_abort_message,posix_fadvise,
posix_fadvise64,pthread_gettid_np. - Added the required permissions to the
native-media/AndroidManifest.xml
sample.
(Issue 106640) - Added
clock_nanosleepandclock_settimeto API level 21. (Issue
77372) - Removed the following symbols from all architectures:
get_malloc_leak_info,free_malloc_leak_info,
__srget,__swbuf,__srefill,__swsetup,
__sdidinit,__sflags,__sfp,
__sinit,__smakebuf,__sflush,__sread,
__swrite,__sseek,__sclose,
_fwalk,__sglue,__get_thread,__wait4,
__futex_wake,__open,__get_tls,
__getdents64, anddlmalloc. - Removed the following functions from the 64-bit architectures:
basename_r,
dirname_r,__isthreaded,_flush_cache(mips64). - Removed the following function from the 32-bit architectures:
__signalfd4. - Changed the type of the third argument from
size_ttointin
the following functions:strtoll_l,strtoull_l,
wcstoll_l, andwcstoull_l. - Restored the following functions to the 64-bit architecture:
arc4random,
arc4random_buf, andarc4random_uniform. - Moved
cxa_*and thenewanddeleteoperators back
tolibstdc++.so. This change restores r9d behavior; previous versions of r10
contained dummy files.
- Added more TV keycodes:
- Restored MXU support in GCC 4.8 and 4.9 for mips. This support had been absent from
r10 and r10b because those versions of GCC had been compiled with binutils-2.24, which did
not support MXU. It now does. - Fixed
--toolchain=inmake-standalone-toolchain.shso that it
now properly supports use of a suffix specifying a version of Clang. - Fixed the libc++/armeabi
strtod()functions. - Made fixes to NDK documentation in
docs/.
- Made the following header and library fixes to
- Other changes:
-
- Enhanced
cpu-featuresto detect ARMv8 support for the following
instruction sets: AES, CRC32, SHA2, SHA1, and 64-bit PMULL/PMULL2. (Issue
106360) - Modified ndk-build to use
*-gcc-ar, which is available in GCC 4.8, GCC 4.9, and
Clang. Clang specifies it, instead of*-ar. This setting brings improved LTO
support. - Removed the
include-fixed/linux/a.out.hand
include-fixed/linux/compiler.hheaders from the GCC compiler.
(Issue 73728) - Fixed an issue related to
-fltowith GCC 4.8 on Mac OS X. The error message
read:
.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so Symbol not found: _environ
- Fixed a typo in
build-binary.mk.(Issue
76992) - Enhanced
- Important known issues:
-
- Specifying -Os (
-fauto-profile) in GCC4.9 may cause crashing.
(Issue 77571)
- Specifying -Os (

- Important notes:
-
- Because of the 512MB size restriction on downloadable packages, the following 32-bit items are not in the 32-bit NDK download packages. Instead, they reside in the 64-bit ones:
- Android-L headers
- GCC 4.9
- Currently, the only Renderscript support provided by the NDK is for 32-bit Renderscript with Android 4.4 (API level 19). You cannot build HelloComputeNDK (the only Renderscript sample) with any other combination of Renderscript (32- or 64-bit) and Android version.
- To compile native-codec, you must use a 64-bit NDK package, which is where all the Android-L headers are located.
- Important bug fixes:
-
- Fixed gdb 7.6 in GCC 4.8/4.9. (Issues 74112 and 74371.)
- Fixed GCC 4.8/4.9 for x86, so that they no longer enable
-msse4.2and-mpopcntby default. (Issue 73843.)
- Other bug fixes:
-
- Removed
stdio.hfrom theinclude-fixed/directories of all versions of GCC. (Issue 73728.) - Removed duplicate header files from the Windows packages in the
platforms/android-L/arch-*/usr/include/linux/netfilter*/directories. (Issue 73704.) - Fixed a problem that prevented Clang from building HelloComputeNDK.
- Fixed atexit. (Issue 66595.)
- Made various fixes to the docs in
docs/andsources/third_party/googletest/README.NDK. (Issue 74069.) - Made the following fixes to the Android-L headers:
- Added the following functions to
ctype.handwchar.h:dn_expand(),grantpt(),inet_nsap_addr(),inet_nsap_ntoa(),insque(),nsdispatch(),posix_openpt(),__pthread_cleanup_pop(),__pthread_cleanup_push(),remque(),setfsgid(),setfsuid(),splice(),tee(),twalk()(Issue 73719), and 42*_l()functions. - Renamed
cmsg_nxthdrto__cmsg_nxthdr. - Removed
__libc_malloc_dispatch. - Changed the
ptrace()prototype tolong ptrace(int, ...);. - Removed
sha1.h. - Extended
android_dlextinfoinandroid/dlext.h. - Annotated
__NDK_FPABI__for functions receiving or returning float- or double-type values instdlib.h,time.h,wchar.h, andcomplex.h.
- Removed
- Other changes:
-
- Updated
mipsel-linux-android-4.9andmips64el-linux-android-4.9, implementing a new multilib directory layout, and providing support for gdb-7.7 - Enhanced
cpu-featuresto detect more arm64 features. (Change list 100339.)
- Updated

- Important changes:
-
- Added 3 new ABIs, all 64-bit: arm64-v8a, x86_64, mips64.
- GCC 4.9 is the default compiler for 64-bit ABIs. Clang is currently version 3.4.
NDK_TOOLCHAIN_VERSION=clang
may not work for arm64-v8a and mips64. - Android-L is the first level with 64-bit support. Note that this API
level is a temporary one, and only for L-preview. An actual API level number will replace it at
L-release. - This release includes now includes
all32andall64
settings forAPP_ABI.APP_ABI=all32is equivalent to
APP_ABI=armeabi,armeabi-v7a,x86,mips.APP_ABI=all64is equivalent to
APP_ABI=arm64-v8a,x86_64,mips64.APP_ABI=allselects all ABIs.
- The new GNU libstdc++ in Android-L contains all
<tr1/cmath>
Before defining your own math function, check_GLIBCXX_USE_C99_MATH_TR1to see a
function with that name already exists, in order to avoid «multiple definition» errors from the
linker. - The cpu-features library has been updated for the ARMv8 kernel. The existing
cpu-features library may fail to detect the presence of NEON on the ARMv8 platform. Recompile your
code with the new version. - Added a new
platforms/android-L/API directory. It includes: - Updated Bionic headers, which had not changed from Android API levels 3
(Cupcake) to 19 (KitKat). This new version, for level L, is to be synchronized with AOSP. - New media APIs and a native-codec sample.
- An updated
Android.hheader for SLES/OpenSLES, enabling support for
single-precision, floating-point audio format in AudioPlayer. - GLES 3.1 and AEP extensions to
libGLESv3.so. - GLES2 and GLES3 headers updated to the latest official Khronos versions.
- Added GCC 4.9 compilers to the 32-/64-bit ABIs. GCC 4.9 is the default (only) compiler
for 64-bit ABIs, as previously mentioned. For 32-bit ABIs, you must explcitly enable GCC 4.9, as
GCC 4.6 is still the default. - For ndk-build, enable 32-bit, GCC 4.9 building either by adding
NDK_TOOLCHAIN_VERSION=4.9toApplication.mk, or exporting it as an
environment variable from the command line. - For a standalone toolchain, use the
--toolchain=option in the
make-standalone-toolchain.shscript. For example:--toolchain=arm-linux-androideabi-4.9. - Upgraded GDB to version 7.6 in GCC 4.8/4.9 and x86*. Since GDB is still at version GDB-7.3.x in
GCC 4.6 (the default for ARM and MIPS), you must set
NDK_TOOLCHAIN_VERSION=4.8or4.9to enable ndk-gdb to select GDB 7.6. - Added the
-mssse3build option to provide SSSE3 support, and made it the default for ABI x86
(upgrading from SSE3). The image released by Google does not contain SSSE3 instructions. - Updated GCC 4.8 to 4.8.3.
- Improved ARM libc++ EH support by switching from gabi++ to libc++abi. For details, see the «C++ Support» section of the documentation.
Note that: - All tests except for locale now pass for Clang 3.4 and GCC 4.8. For more
information, see the «C++ Support» section of the documentation. - The libc++ libraries for X86 and MIPS libc++ still use gabi++.
- GCC 4.7 and later can now use <atomic>.
- You must add
-fno-strict-aliasingif you use<list>, because__list_imp::_end_ breaks
TBAA rules. (Issue 61571.) - As of GCC 4.6, LIBCXX_FORCE_REBUILD:=true no longer rebuilds libc++. Rebuilding it
requires the use of a different compiler. Note that Clang 3.3 is untested. - mclinker is now version 2.7, and has aarch64 Linux support.
- Added precompiled header support for headers specified by
LOCAL_PCH. (Issue 25412).
Note that:
- Important bug fixes:
-
- Fixed libc++ so that it now compiles
std::feof, etc. (Issue 66668). - Fixed a Clang 3.3/3.4 atomic library call that caused crashes in some of the libc++
tests for ABI armeabi. - Fixed Clang 3.4 crashes that were occurring on reading precompiled headers. (Issue 66657).
- Fixed the Clang 3.3/3.4
-O3assert on: - Fixed the following Clang 3.3/3.4 crash:
llvm-3.2/llvm/include/llvm/MDBuilder.h:64: llvm::MDNode*(Issue 57381).
llvm::MDBuilder::createBranchWeights(llvm::ArrayRef): Assertion Weights.size() >= 2
&& "Need at least two branch weights!"Assertion failed: (!Fn && "cast failed but able to resolve overload expression!!"), function CheckCXXCStyleCast, file.
Volumes/data/ndk-toolchain/src/llvm-3.3/llvm/tools/clang/lib/Sema/SemaCast.cpp, line 2018
(Issue 66950). - Fixed libc++ so that it now compiles
- Other bug fixes:
-
- Fixed headers:
- Fixed 32-bit
ssize_tto beintinstead oflong.
int - Fixed
WCHAR_MINandWCHAR_MAXso that they they take
appropriate signs according to the architecture they’re running on: - X86/MIPS: signed.
- ARM: unsigned.
- To force X86/MIPS to default to unsigned, use
-D__WCHAR_UNSIGNED__. - To force
wchar_tto be 16 bits, use-fshort-wchar. - Removed non-existent symbols from 32-bit
libc.so, and addedpread64,
pwrite64,ftruncate64for
Android API level 12 and higher. (Issue 69319). For more
information, see the commit message accompanying AOSP change list
94137. - Fixed GCC warning about redefinition of
putchar. Warning message reads: - Fixed
make-standalone-toolchain.sh --stl=libc++so that it: - Copies
cxxabi.h. (Issue 68001). - Runs in directories other than the NDK install directory. (Issues 67690 and 68647).
- Fixed GCC/Windows to quote arguments only when necessary for spawning processes in
external programs. This change decreases the likelihood of exceeding the 32K length limit. - Fixed an issue that made it impossible to adjust the
APP_PLATFORM
environment variable. - Fixed the implementation of
IsSystemLibrary()in crazy_linker so that it
usesstrrchr()
instead ofstrchr()to find the library path’s true basename. - Fixed native-audio’s inability to build in debug mode.
- Fixed gdb’s inability to print extreme floating-point numbers. (Issue 69203).
- Fixed Clang 3.4 inability to compile with
-Wl,-shared(as opposed to
-shared, which
had no compilation issues). The problem was that Clang added-piefor Android
targets if neither-sharednor-staticexisted. This behavior, which was
incorrect, caused the linker to complain that-sharedand-piecould not
co-exist.
include/stdio.h:236:5: warning: conflicts with previous declaration here(Change list 91185).
[-Wattributes] int putchar(int); - Other changes:
-
- Added
arm_neon.hto the x86 toolchain so that it now emulates ~47% of
Neon. There is currently no support for 64-bit types. For more information, see the section on ARM
Neon intrinsics support in the x86 documentation. - Ported ARM/GOT_PREL optimization (present in GCC 4.6 built from the GCC google branch) to
ARM GCC 4.8/4.9. This optimization sometimes reduces instruction count when accessing global
variables. As an example, see the build.sh script in
$NDK/tests/build/b14811006-GOT_PREL-optimization/. - Added ARM version for STL gabi++, stlport, and libc++. They now have both it and Thumb
mode. - It is now possible to call the make-standalone-toolchain.sh script with
--toolchain=x86_64-linux-android-4.9, which is equivalent to
--toolchain=x86_64-4.9.
- Added

- Important changes:
-
- Added support for the Clang 3.4 compiler. The
NDK_TOOLCHAIN_VERSION=clangoption now picks Clang 3.4. GCC 4.6 is
still the default compiler. - Added
APP_ABI=armeabi-v7a-hard, with
additional multilib option-mfloat-abi=hard. These options are for
use with ARM GCC 4.6/4.8 and Clang 3.3/3.4 (which use 4.8’s assembler, linker,
and libs). When using these options, note the following changes: - When executing the
ndk-buildscript, add the
following options for armeabi-v7a target:TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1 TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard
The built library is copied to
libs/armeabi-v7a. For make to
behave as expected, you cannot specify botharmeabi-v7aand
armeabi-v7a-hardas make targets (i.e., on the APP_ABI= line).
Doing so causes one of them to be ignored. Note thatAPP_ABI=all
is still equivalent to
armeabi armeabi-v7a x86 mips. - The
make-standalone-toolchain.shscript copies
additional libaries under/harddirectories.
Add the aboveCFLAGSandLFLAGSto your
makefile to enable GCC or Clang to link with
libraries in/hard. - Added the yasm assembler, as well as
LOCAL_ASMFLAGS
andEXPORT_ASMFLAGSflags for x86
targets. Thendk-buildscript uses
prebuilts/*/bin/yasm*to buildLOCAL_SRC_FILESthat
have the.asmextension. - Updated MClinker to 2.6.0, which adds
-gc-sections
support. - Added experimental libc++ support (upstream r201101). Use this new
feature by following these steps:- Add
APP_STL := c++_staticorAPP_STL :=in
c++_sharedApplication.mk.
You may rebuild from source viaLIBCXX_FORCE_REBUILD :=
true - Execute
make-standalone-toolchain.sh --stl=libc++
to create a standalone toolchain with libc++ headers/lib.
For more information, see
CPLUSPLUS-SUPPORT.html.
(Issue 36496) - Add
- Added support for the Clang 3.4 compiler. The
- Important bug fixes:
-
- Fixed an uncaught throw from an unexpected
exception handler for GCC 4.6/4.8 ARM EABI. (GCC Issue 59392) - Fixed GCC 4.8 so that it now correctly resolves partial
specialization of a template with
a dependent, non-type template argument. (GCC Issue 59052) - Added more modules to prebuilt python (Issue 59902):
- Mac OS X:
zlib,bz2,
_curses,_curses_panel,_hashlib,
_ssl - Linux:
zlib,nis,
crypt,_curses, and_curses_panel
- Mac OS X:
- Fixed the x86 and MIPS gdbserver
event_getmsg_helper. - Fixed numerous issues in the RenderScript NDK toolchain, including
issues with compatibility across older devices and C++ reflection.
- Fixed an uncaught throw from an unexpected
- Other bug fixes:
-
- Header fixes:
- Fixed a missing
#include <sys/types.h>in
android/asset_manager.hfor Android API level 13 and higher.
(Issue 64988) - Fixed a missing
#includein
android/rect_manager.hfor Android API level 14 and higher. - Added
JNICALLtoJNI_OnLoadand
JNI_OnUnloadinjni.h. Note thatJNICALL
is defined as__NDK_FPABI__For more information, see
sys/cdefs.h. - Updated the following headers so that they can be included
without the need to
manually include their dependencies (Issue 64679):
android/tts.h EGL/eglext.h fts.h GLES/glext.h GLES2/gl2ext.h OMXAL/OpenMAXSL_Android.h SLES/OpenSLES_Android.h sys/prctl.h sys/utime.h
- Fixed a missing
- Added
sys/cachectl.hfor all architectures. MIPS
developers can now include this header instead of writing#ifdef.
__mips__ - Fixed
platforms/android-18/include/android/input.hby adding
__NDK_FPABI__to functions taking or returning
float or double values. - Fixed MIPS
struct stat, which was incorrectly set
to its 64-bit counterpart for Android API level 12 and later. This wrong
setting was a
regression introduced in release r9c. - Defined
__PTHREAD_MUTEX_INIT_VALUE,
__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE,
and__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUEfor Android API
level 9 and lower. - Added
scalbln,scalblnf, and
scalblnlto x86libm.sofor APIs 18 and later. - Fixed a typo in
sources/android/support/include/iconv.h.
(Issue 63806)
- Fixed gabi++
std::unexpected()to call
std::terminate()so that
a user-definedstd::terminate()handler has a chance to run.- Fixed gabi++ to catch
std::nullptr.- Fixed samples Teapot and MoreTeapots:
- Solved a problem with Tegra 2 and 3 chips by changing specular
variables to use medium precision. Values for specular power can now be less
than 1.0. - Changed the samples so that pressing the volume button restores
immersive mode and invalidates
SYSTEM_UI_FLAG_IMMERSIVE_STICKY. Screen rotation does not
triggeronSystemUiVisibilityChange, and so does not restore
immersive mode.
- Fixed the
ndk-buildscript to add
-rpath-link=$SYSROOT/usr/liband
-rpath-link=$TARGET_OUTin order to useld.bfdto
link executables. (Issue 64266)- Removed
-Bsymbolicfrom all STL builds.- Fixed
ndk-gdb-py.cmdby settingSHELLas
an environment variable
instead of passing it to
python.exe, which ignores the setting.
(Issue 63054)- Fixed the
make-standalone-toolchain.shscript so that
the--stl=stlportoption copies the gabi++ headers instead of
symlinking them; thecmd.exeand MinGW shells do not understand
symlinks created by cygwin. - Header fixes:
- Other changes:
-
- Applied execution permissions to all
*cmdscripts
previously intended for use only in thecmd.exeshell, in case
developers prefer to usendk-build.cmdin cygwin instead of the
recommendedndk-buildscript. - Improved the speed of the
make-standalone-toolchain.sh
script by moving instead of copying if the specified destination directory does
not exist.
- Applied execution permissions to all

This is a bug-fix-only release.
- Important bug fixes:
-
- Fixed a problem with GCC 4.8 ARM, in which the stack pointer is
restored too early. This problem prevented the frame pointer from reliably
accessing a variable in the stack frame. (GCC Issue 58854) - Fixed a problem with GCC 4.8 libstdc++, in which a bug in
std::nth_element was causing generation of code that produced a random
segfault. (Issue 62910) - Fixed GCC 4.8 ICE in cc1/cc1plus with
-fuse-ld=mcld, so that the following error no longer occurs:cc1: internal compiler error: in common_handle_option, at opts.c:1774
- Fixed
-mhard-floatsupport for
__builtinmath functions. For ongoing information on fixes for
-mhard-floatwith STL, please follow Issue 61784.
- Fixed a problem with GCC 4.8 ARM, in which the stack pointer is
- Other bug fixes:
-
- Header fixes:
- Changed prototype of
polltopoll(structin
pollfd *, nfds_t, int);poll.h. - Added
utimensattolibc.sofor Android
API levels 12 and 19. These libraries are now included for all Android API
levels 12 through 19. - Introduced
futimensintolibc.so, for Android API
level 19. - Added missing
clock_settime()and
clock_nanosleep()totime.hfor Android API level 8
and higher. - Added
CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE,and
CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME, CLOCK_REALTIME_ALARM,
CLOCK_BOOTTIME_ALARMintime.h. - Removed obsolete
CLOCK_REALTIME_HRand
CLOCK_MONOTONIC_HR.
- Changed prototype of
- In samples Teapot, MoreTeapots, and
source/android/ndk_helper:- Changed them so that they now use a hard-float abi for armeabi-v7a.
- Updated them to use immersive mode on Android API level 19 and
higher. - Fixed a problem with
Check_ReleaseStringUTFCharsin
/system/lib/libdvm.sothat was causing crashes on x86 devices.
- Fixed
ndk-buildfails that happen in cygwin when the NDK
package is
referenced via symlink. - Fixed
ndk-build.cmdfails that happen in windows
cmd.exewhen
LOCAL_SRC_FILEScontains absolute paths. (Issue 69992) - Fixed the
ndk-stackscript to proceed even when it can’t parse
a frame due to inability to find a routine, filename, or line number. In any of
these cases, it prints??. - Fixed the
ndk-stackstack for windows-x64_64 targets so that
it no longer erroneously matches a frame line with a line in the
stack:section that doesn’t containpc,
eip, orip. For example:I/DEBUG ( 1151): #00 5f09db68 401f01c4 /system/lib/libc.so
- Fixed gabi++ so that it:
- Does not use malloc() to allocate C++ thread-local
objects. - Avoids deadlocks in gabi++ in cases where libc.debug.malloc is
non-zero in userdebug/eng Android platform builds.
- Does not use malloc() to allocate C++ thread-local
- Header fixes:
- Other changes:
-
- Added
LOCAL_EXPORT_LDFLAGS. - Introduced the
NDK_PROJECT_PATH=nullsetting for use in an
integrated build system where options are explicitly passed to
ndk-build. With this setting,ndk-buildmakes no
attempt to look forNDK_PROJECT_PATH.This setting also prevents
variables from deriving default settings from NDK_PROJECT_PATH. As a result,
the following variables must now be explicitly specified (with their default
values if such exist):NDK_OUT, NDK_LIBS_OUT, APP_BUILD_SCRIPT,(optional, default to 0), and other
NDK_DEBUGAPP_*‘s
contained inApplication.mk. APP_ABIcan now be enumerated in a comma-delimited list. For
example:APP_ABI := "armeabi,armeabi-v7a"
- Provided the ability to rebuild all of STL with debugging info in an
optional, separate package called
android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip, using the
-goption. This option
helps thendk-stackscript provide better a stack dump across STL.
This change should not affect the code/size of the final, stripped file. - Enhanced
hello-jnisamples to reportAPP_ABIat
compilation. - Used the
artool in Deterministic mode (option
-D) to build static libraries. (Issue 60705)
- Added

- Important changes:
-
- Updated
include/android/*handmath.hfor all Android API levels up to
18, including the addition of levels 13, 15, 16 and 17.
For information on added APIs, see commit messages for Changes
68012 and
68014.
(Issues 47150,
58528, and
38423) - Added support for Android API level 19, including Renderscript binding.
- Added support for
-mhard-floatin the existing armeabi-v7a ABI. For more
information and current restrictions on Clang, see
tests/device/hard-float/jni/Android.mk. - Migrated from GNU Compiler Collection (GCC) 4.8 to 4.8.2, and added diagnostic color
support. To enable diagnostic colors, set-fdiagnostics-color=auto,
-fdiagnostics-color=always,or exportGCC_COLORSas shown below:GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
For more information, see
GCC
Language Independent Options. - Added two new samples to demonstrate OpenGL ES 3.0 features: Teapot and MoreTeapots.
These samples run on devices with Android 4.1 (API level 16) and higher. - Deprecated GCC 4.7 and Clang 3.2 support, which will be removed in the next
release.
- Updated
- Important bug fixes:
-
- Fixed problem with ARM GCC 4.6
thumb2failing to generate 16-bit relative jump
tables. (GCC Issue) - Fixed GCC 4.8 internal compiler error (ICE) on
g++.dg/cpp0x/lambda/lambda-defarg3.C.
(Change 62770,
GCC Issue) - Fixed a problem with Windows 32-bit
*-gdb.exeexecutables failing to launch.
(Issue 58975) - Fixed GCC 4.8 ICE when building bullet library. The error message is as follows:
internal compiler error: verify_flow_info failed
(Issue 58916,
GCC Issue) - Modified GDB/ARM build to skip
ARM.exidxdata for unwinding in prologue code and
added a command (set arm exidx-unwinding) to control exidx-based stack unwinding.
(Issue 55826) - Fixed Clang 3.3 MIPS compiler problem where HI and LO registers are incorrectly
reused. - Fixed issue with MIPS 4.7 ICE in
dbx_reg_number. The error message is as
follows:external/icu4c/i18n/decimfmt.cpp:1322:1: internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
(GCC Patch)
- Fixed problem with ARM GCC 4.6
- Other bug fixes:
-
- Header fixes
- Fixed the ARM
WCHAR_MINandWCHAR_MAXto be unsigned according to
spec (the X86/MIPS versions are signed). Define_WCHAR_IS_ALWAYS_SIGNEDto
restore old behavior. (Issue 57749) - Fixed
include/netinet/tcp.hto containTCP_INFOstate enum.
(Issue 38881) - Fixed the
cdefs_elh.hmacro_C_LABEL_STRINGto stop generating
warnings in the GCC 4.8 toolchain when using c++11 mode.
(Issue 58135,
Issue 58652) - Removed non-existent functions
imaxabsandimaxdivfrom header
inttypes.h. - Fixed issue with
pthread_exit()return values andpthread_self().
(Issue 60686) - Added missing
mkdtemp()function, which already exists inbionic
headerstdlib.h.
- Fixed the ARM
- Fixed problem building
samples/gles3jniwith Clang on Android API level 11. - Fixed MCLinker to allow multiple occurrences of the following options:
-gc-sectionsand--eh-frame-hdr. - Fixed MCLinker to accept the
--no-warn-mismatchoption. - Modified
cpu-featuresoption to not assume all VFPv4 devices support IDIV.
Now this option only adds IDIV to white-listed devices, including Nexus 4.
(Issue 57637) - Fixed problem with
android_native_app_glue.cerroneously logging errors on event
predispatch operations. - Fixed all operations on
gabi++terminate and unexpected_handler to be
thread-safe. - Fixed several issues with Clang
-integrated-asoption so it can pass
tests forssax-instructionsandfenv. - Fixed GCC 4.6/4.7/4.8 compiler to pass the linker option
--eh-frame-hdreven
for static executables. For more information, see the
GCC patch. - Fixed extra apostrophe in
CPU-ARCH-ABIS.html. For more information, see
NDK-DEPENDS.html. (Issue 60142) - Fixed extra quotes in ndk-build output on Windows.
(Issue 60649) - Fixed Clang 3.3 to compile ARM’s built-in, atomic operations such as
__atomic_fetch_add,__atomic_fetch_sub, and__atomic_fetch_or. - Fixed Clang 3.3 ICE with customized
vfprintf.
(Clang issue)
- Header fixes
- Other changes:
-
- Enabled OpenMP for all GCC builds. To use this feature, add the following flags to your
build settings:LOCAL_CFLAGS += -fopenmp LOCAL_LDFLAGS += -fopenmp
For code examples, see
tests/device/test-openmp - Reduced the size of
ld.mcldsignificantly (1.5MB vs.ld.bfd3.5MB and
ld.gold7.5MB), resulting in a speed improvement of approximately 20%. - Added
LOCAL_CONLYFLAGSandAPP_CONLYFLAGSto specify
options applicable to C only but not C++. The existingLOCAL_CFLAGS
andAPP_CFLAGSare also used for C++ compilation (to save trouble of
specifying most options twice), so options such as-std=gnu99may fail in
g++ builds with a warning and clang++ builds with an error. - Added
gabi++array helper functions. - Modified GCC builds so that all
libgcc.afiles are built with
-funwind-tablesto allow the stack to be unwound past previously blocked
points, such as__aeabi_idiv0. - Added Ingenic MXU support in MIPS GCC4.6/4.7/4.8 with new
-mmxu
option. - Extended MIPS GCC4.6/4.7/4.8
-mldc1-sdc1to control ldxc1/sdxc1 too - Added crazy linker. For more information, see
sources/android/crazy_linker/README.TXT. - Fixed
bitmap-plasmato draw to full screen rather than a 200×200 pixel
area. - Reduced linux and darwin toolchain sizes by 25% by creating symlinks to identical files.
- Enabled OpenMP for all GCC builds. To use this feature, add the following flags to your

- Important changes:
-
- Added support for Android 4.3 (API level 18). For more information, see
STABLE-APIS.htmland new code examples insamples/gles3jni/README. - Added headers and libraries for OpenGL ES 3.0, which is supported by Android 4.3
(API level 18) and higher. - Added GNU Compiler Collection (GCC) 4.8 compiler to the NDK. Since GCC 4.6 is still
the default, you must explicitly enable this option:- For
ndk-buildbuilds, exportNDK_TOOLCHAIN_VERSION=4.8or
add it inApplication.mk. - For standalone builds, use the
--toolchain=option in
make-standalone-toolchain.sh, for example:
--toolchain=arm-linux-androideabi-4.8
Note:
The-Wunused-local-typedefsoption is enabled by-Wall. Be
sure to add__attribute__((unused))if you use compile-time asserts like
sources/cxx-stl/stlport/stlport/stl/config/features.h, line #311. For more
information, see
Change 55460Note:
In the GCC 4.7 release and later, ARM compilers generate unaligned access code by
default for ARMv6 and higher build targets. You may need to add the
-mno-unaligned-accessbuild option when building for kernels that do not support
this feature. - For
- Added Clang 3.3 support. The
NDK_TOOLCHAIN_VERSION=clangbuild option
now picks Clang 3.3 by default.Note:
Both GCC 4.4.3 and Clang 3.1 are deprecated, and will be removed from the next NDK
release. - Updated GNU Project Debugger (GDB) to support python 2.7.5.
- Added MCLinker to support Windows hosts. Since
ld.gold
is the default where available, you must add-fuse-ld=mcldin
LOCAL_LDFLAGSorAPP_LDFLAGSto enable MCLinker. - Added
ndk-dependstool which prints ELF library dependencies.
For more information, seeNDK-DEPENDS.html.
(Issue 53486)
- Added support for Android 4.3 (API level 18). For more information, see
- Important bug fixes:
-
- Fixed potential event handling issue in
android_native_app_glue.
(Issue 41755) - Fixed ARM/GCC-4.7 build to generate sufficient alignment for NEON load and store
instructions VST and VLD.
(GCC Issue 57271) - Fixed a GCC 4.4.3/4.6/4.7 internal compiler error (ICE) for a constant negative index
value on a string literal.
(Issue 54623) - Fixed GCC 4.7 segmentation fault for constant initialization with an object address.
(Issue 56508) - Fixed GCC 4.6 ARM segmentation fault for
-Ovalues when using Boost
1.52.0. (Issue 42891) - Fixed
libc.soandlibc.ato support thewait4()function.
(Issue 19854) - Updated the x86 libc.so and libc.a files to include the
clone()
function. - Fixed
LOCAL_SHORT_COMMANDSbug where thelinker.listfile is
empty or not used. - Fixed GCC MIPS build on Mac OS to use CFI directives, without which
ld.mcld --eh-frame-hdrfails frequently. - Fixed Clang 3.2 X86/MIPS internal compiler error in
llvm/lib/VMCore/Value.cpp.
(Change 59021) - Fixed GCC 4.7 64-bit Windows assembler crash. (Error:
out of memory allocating).
4294967280 bytes - Updated
ndk-gdbscript so that the--startor--launchactions
now wait for the GNU Debug Server, so that it can more reliably hit breakpoints set
early in the execution path (such as breakpoints in JNI code).
(Issue 41278)Note:
This feature requires jdb and produces warning about pending breakpoints.
Specify the--nowaitoption to restore previous behavior. - Fixed GDB crash when library list is empty.
- Fixed GDB crash when using a
stepicommand past abx pcor
blx pcThumb instruction.
(Issue 56962,
Issue 36149) - Fixed MIPS
gdbserverto look forDT_MIPS_RLD_MAPinstead of
DT_DEBUG. (Issue 56586) - Fixed a circular dependency in the ndk-build script, for example: If A->B and
B->B, then B was dropped from build.
(Issue 56690)
- Fixed potential event handling issue in
- Other bug fixes:
-
- Fixed the
ndk-buildscript to enable you to specify a version of Clang as a
command line option (e.g.,NDK_TOOLCHAIN_VERSION=clang3.2). Previously, only
specifying the version as an environment variable worked. - Fixed gabi++ size of
_Unwind_Exceptionto be 24 for MIPS build targets when
using the Clang compiler.
(Change 54141) - Fixed the
ndk-buildscript to ensure that built libraries are actually
removed from projects that include prebuilt static libraries when using the
ndk-build cleancommand.
(Change 54461,
Change 54480) - Modified the
NDK_ANALYZE=1option to be less verbose. - Fixed
gnu-libstdc++/Android.mkto include abackward/path for builds
that use backward compability.
(Issue 53404) - Fixed a problem where
stlport newsometimes returned random values. - Fixed
ndk-gdbto match the order ofCPU_ABIS, notAPP_ABIS.
(Issue 54033) - Fixed a problem where the NDK 64-bit build on MacOSX choses the wrong path for
compiler.
(Issue 53769) - Fixed build scripts to detect 64-bit Windows Vista.
(Issue 54485) - Fixed x86
ntonl/swap32error:invalid 'asm': operand number.
out of range
(Issue 54465,
Change 57242) - Fixed
ld.goldto merge string literals. - Fixed
ld.goldto handle large symbol alignment. - Updated
ld.goldto enable the--sort-section=nameoption. - Fixed GCC 4.4.3/4.6/4.7 to suppress the
-export-dynamicoption for
statically linked programs. GCC no longer adds an.interpsection for statically
linked programs. - Fixed GCC 4.4.3
stlportcompilation error about inconsistenttypedef
of_Unwind_Control_Block.
(Issue 54426) - Fixed
awkscripts to handleAndroidManifest.xmlfiles created on
Windows which may contain trailingrcharacters and cause build errors.
(Issue 42548) - Fixed
make-standalone-toolchain.shto probe theprebuilts/
directory to detect if the host is 32 bit or 64 bit. - Fixed the Clang 3.2
-integrated-asoption. - Fixed the Clang 3.2 ARM EHABI compact model
pr1andpr2handler data. - Added Clang
-mllvm -arm-enable-ehabioption to fix the following Clang error:clang: for the -arm-enable-ehabi option: may only occur zero or one times!
- Fixed build failure when there is no
uses-sdkelement in application
manifest. (Issue 57015)
- Fixed the
- Other changes:
-
- Header Fixes
- Modified headers to make
__set_errnoan inlined function, since
__set_errnoinerrno.his deprecated, andlibc.sono longer
exports it. - Modified
elf.hto includestdint.h.
(Issue 55443) - Fixed
sys/un.hto be included independently of other headers.
(Issue 53646) - Fixed all of the
MotionEvent_getHistoricalAPI family to take the
const AInputEvent* motion_event.
(Issue 55873) - Fixed
malloc_usable_sizeto takeconst void*.
(Issue 55725) - Fixed stdint.h to be more compatible with C99.
(Change 46821) - Modified
wchar.hto not redefineWCHAR_MAXand
WCHAR_MIN - Fixed
<inttypes.h>declaration for pointer-relatedPRIand
SCNmacros. (Issue 57218) - Changed the
sys/cdefs.hheader so that__WCHAR_TYPE__is 32-bit
for API levels less than 9, which means thatwchat_tis 32-bit for all
API levels. To restore the previous behavior, define the_WCHAR_IS_8BIT
boolean variable. (Issue 57267)
- Modified headers to make
- Added more formatting in NDK
docs/and miscellaneous documentation fixes. - Added support for a thin archive technique when building static libraries.
(Issue 40303) - Updated script
make-standalone-toolchain.shto support thestlport
library in addition tognustl, when you specify the option
--stl=stlport. For more information, seeSTANDALONE-TOOLCHAIN.html. - Updated the
make-standalone-toolchain.shscript so that the
--llvm-version=option creates the$TOOLCHAIN_PREFIX-clangand
$TOOLCHAIN_PREFIX-clang++scripts in addition toclangand
clang++, to avoid using the host’s clang and clang++ definitions by accident. - Added two flags to re-enable two optimizations in upstream Clang but disabled in
NDK for better compatibility with code compiled by GCC:- Added a
-fcxx-missing-return-semanticsflag to re-enable missing
return
semantics in Clang 3.2+. Normally, all paths should terminate with a return
statement for a value-returning function. If this is not the case, clang inserts
an undefined instruction (or trap in debug mode) at the path without a return
statement. If you are sure your code is correct, use this flag to allow the
optimizer to take advantage of the undefined behavior. If you are not sure, do not
use this flag. The caller may still receive a random incorrect value, but the
optimizer will not exploit it and make your code harder to debug. - Added a
-fglobal-ctor-const-promotionflag to re-enable
promoting global variables with static constructor to be constants. With this flag,
the global variable optimization pass of LLVM tries to evaluate the global
variables with static constructors and promote them to global constants. Although
this optimization is correct, it may cause some incompatability with code compiled
by GCC. For example, code may doconst_castto cast the constant to mutable
and modify it. In GCC, the variable is in read-write and the code is run by
accident. In Clang, the const variable is in read-only memory and may cause your
application to crash.
- Added a
- Added
-mldc1-sdc1to the MIPS GCC and Clang compilers. By default, compilers
align 8-byte objects properly and emit theldc1andsdc1instructions
to move them around. If your app uses a custom allocator that does not always align
with a new object’s 8-byte boundary in the same way as the default allocator, your app
may crash due toldc1andsdc1operations on unaligned memory. In this
case, use the-mno-ldc1-sdc1flag to workaround the problem. - Downgraded the event severity from warning to info if
APP_PLATFORM_LEVELis
larger thanAPP_MIN_PLATFORM_LEVEL. TheAPP_PLATFORM_LEVELmay be lower
thanAPP_PLATFORMinjni/Application.mkbecause the NDK does not have
headers for all levels. In this case, the actual level is shifted downwards. The
APP_MIN_PLATFORM_LEVELis specified by theandroid:minSdkVersionin
your application’s manifest.
(Issue 39752) - Added the
android_getCpuIdArm()andandroid_setCpuArm()methods to
cpu-features.c. This addition enables easier retrieval of the ARM CPUID
information. (Issue 53689) - Modified
ndk-buildto use GCC 4.7’sas/ldfor Clang compiling.Note:
In GCC 4.7,monotonic_clockandis_monotonichave been renamed to
steady_clockandis_steady, respectively. - Added the following new warnings to the
ndk-buildscript:- Added warnings if
LOCAL_LDLIBS/LDFLAGSare used in static library
modules. - Added a warning if a configuration has no module to build.
- Added a warning for non-system libraries being used in
LOCAL_LDLIBS/LDFLAGSof a shared library or executable modules.
- Added warnings if
- Updated build scripts, so that if
APP_MODULESis not defined and only static
libraries are listed inAndroid.mk, the script force-builds all of them.
(Issue 53502) - Updated
ndk-buildto support absolute paths inLOCAL_SRC_FILES. - Removed the
*-gdbtuiexecutables, which are duplicates of the*-gdb
executables with the-tuioption enabled. - Updated the build scripts to warn you when the Edison Design Group (EDG) compiler
front-end turns_STLP_HAS_INCLUDE_NEXTback on.
(Issue 53646) - Added the environment variable
NDK_LIBS_OUTto allow overriding of the
path forlibraries/gdbserverfrom the default$PROJECT/libs.
For more information, seeOVERVIEW.html. - Changed ndk-build script defaults to compile code with format string protection
-Wformat -Werror=format-security. You may set
LOCAL_DISABLE_FORMAT_STRING_CHECKS=trueto disable it.
For more information, seeANDROID-MK.html - Added STL pretty-print support in
ndk-gdb-py. For more information, see
NDK-GDB.html. - Added tests based on the googletest frameworks.
- Added a notification to the toolchain build script that warns you if the current shell
is notbash.
- Header Fixes

- Important changes:
-
- Added 64-bit host toolchain set (package name suffix
*-x86_64.*). For more
information, seeCHANGES.HTMLandNDK-BUILD.html. - Added Clang 3.2 compiler. GCC 4.6 is still the default. For information on using the
Clang compiler, seeCHANGES.HTML. - Added static code analyzer for Linux/MacOSX hosts. For information on using the
analyzer, seeCHANGES.HTML. - Added MCLinker for Linux/MacOSX hosts as an experimental feature. The
ld.gold
linker is the default where available, so you must explicitly enable it. For more
information, seeCHANGES.HTML. - Updated ndk-build to use topological sort for module dependencies, which means the
build automatically sorts out the order of libraries specified in
LOCAL_STATIC_LIBRARIES,LOCAL_WHOLE_STATIC_LIBRARIESand
LOCAL_SHARED_LIBRARIES. For more information, seeCHANGES.HTML.
(Issue 39378)
- Added 64-bit host toolchain set (package name suffix
- Important bug fixes:
-
- Fixed build script to build all toolchains in
-O2. Toolchains in previous
releases were incorrectly built without optimization. - Fixed build script which unconditionally builds Clang/llvm for MacOSX in 64-bit.
- Fixed GCC 4.6/4.7 internal compiler error:
gen_thumb_movhi_clobber at config/arm/arm.md:5832.
(Issue 52732) - Fixed build problem where GCC/ARM 4.6/4.7 fails to link code using 64-bit atomic
built-in functions.
(Issue 41297) - Fixed GCC 4.7 linker DIV usage mismatch errors.
(Sourceware Issue) - Fixed GCC 4.7 internal compiler error
build_data_member_initialization, at.
cp/semantics.c:5790 - Fixed GCC 4.7 internal compiler error
redirect_eh_edge_1, at tree-eh.c:2214.
(Issue 52909) - Fixed a GCC 4.7 segfault.
(GCC Issue) - Fixed
<chrono>clock resolution and enabledsteady_clock.
(Issue 39680) - Fixed toolchain to enable
_GLIBCXX_HAS_GTHREADSfor GCC 4.7 libstdc++.
(Issue 41770,
Issue 41859) - Fixed problem with the X86 MXX/SSE code failing to link due to missing
posix_memalign.
(Change 51872) - Fixed GCC4.7/X86 segmentation fault in
i386.c, function
distance_non_agu_define_in_bb().
(Change 50383) - Fixed GCC4.7/X86 to restore earlier
cmovbehavior.
(GCC Issue) - Fixed handling NULL return value of
setlocale()in libstdc++/GCC4.7.
(Issue 46718) - Fixed
ld.goldruntime undefined reference to__exidx_startand
__exidx_start_end.
(Change 52134) - Fixed Clang 3.1 internal compiler error when using Eigen library.
(Issue 41246) - Fixed Clang 3.1 internal compiler error including
<chrono>in C++11
mode.
(Issue 39600) - Fixed Clang 3.1 internal compiler error when generating object code for a method
call to a uniform initializedrvalue.
(Issue 41387) - Fixed Clang 3.1/X86 stack realignment.
(Change 52154) - Fixed problem with GNU Debugger (GDB) SIGILL when debugging on Android 4.1.2.
(Issue 40941) - Fixed problem where GDB cannot set
source:linebreakpoints when symbols
contain
long, indirect file paths.
(Issue 42448) - Fixed GDB
read_program_headerfor MIPS PIE executables.
(Change 49592) - Fixed
STLportsegmentation fault inuncaught_exception().
(Change 50236) - Fixed
STLportbus error in exception handling due to unaligned access of
DW_EH_PE_udata2,DW_EH_PE_udata4, andDW_EH_PE_udata8. - Fixed Gabi++ infinite recursion problem with
nothrow new[]operator.
(Issue 52833) - Fixed Gabi++ wrong offset to exception handler pointer.
(Change 53446) - Removed Gabi++ redundant free on exception object
(Change 53447)
- Fixed build script to build all toolchains in
- Other bug fixes:
-
- Fixed NDK headers:
- Removed redundant definitions of
size_t,ssize_t, and
ptrdiff_t. - Fixed MIPS and ARM
fenv.hheader. - Fixed
stddef.hto not redefineoffsetofsince it already exists
in the toolchain. - Fixed
elf.hto containElf32_auxv_tandElf64_auxv_t.
(Issue 38441) - Fixed the
#ifdefC++ definitions in the
OpenSLES_AndroidConfiguration.hheader file.
(Issue 53163)
- Removed redundant definitions of
- Fixed
STLportto abort after out of memory error instead of silently exiting. - Fixed system and Gabi++ headers to be able to compile with API level 8 and lower.
- Fixed
cpufeaturesto not parse/proc/self/auxv.
(Issue 43055) - Fixed
ld.goldto not depend on host libstdc++ and on Windows platforms,
to not depend on thelibgcc_sjlj_1.dlllibrary. - Fixed Clang 3.1 which emits inconsistent register list in
.vsaveand fails
assembler.
(Change 49930) - Fixed Clang 3.1 to be able to compile libgabi++ and pass the
test-stlport
tests for MIPS build targets.
(Change 51961) - Fixed Clang 3.1 to only enable exception by default for C++, not for C.
- Fixed several issues in Clang 3.1 to pass most GNU exception tests.
- Fixed scripts
clangandclang++in standalone NDK compiler to detect
-cc1and to not specify-targetwhen found. - Fixed
ndk-buildto observeNDK_APP_OUTset inApplication.mk. - Fixed X86
libc.soandlib.awhich were missing thesigsetjmp
andsiglongjmpfunctions already declared insetjmp.h.
(Issue 19851) - Patched GCC 4.4.3/4.6/4.7 libstdc++ to work with Clang in C++ 11.
(Clang Issue) - Fixed cygwin path in argument passed to
HOST_AWK. - Fixed
ndk-buildscript warning in windows when running from project’s JNI
directory.
(Issue 40192) - Fixed problem where the
ndk-buildscript does not build if makefile has
trailing whitespace in theLOCAL_PATHdefinition.
(Issue 42841)
- Fixed NDK headers:
- Other changes:
-
- Enabled threading support in GCC/MIPS toolchain.
- Updated GCC exception handling helpers
__cxa_begin_cleanupand
__cxa_type_matchto have default visibility from the previous
hidden visibility in GNU libstdc++. For more information, see
CHANGES.HTML. - Updated build scripts so that Gabi++ and STLport static libraries are now built with
hidden visibility except for exception handling helpers. - Updated build so that
STLportis built for ARM in Thumb mode. - Added support for
std::set_new_handlerin Gabi++.
(Issue 52805) - Enabled
FUTEXsystem call in GNU libstdc++. - Updated
ndk-buildso that it no longer copies prebuilt static library to
a project’sobj/local/<abi>/directory.
(Issue 40302) - Removed
__ARM_ARCH_5*__from ARMtoolchains/*/setup.mkscript.
(Issue 21132) - Built additional GNU libstdc++ libraries in thumb for ARM.
- Enabled MIPS floating-point
madd/msub/nmadd/nmsub/recip/rsqrt
instructions with 32-bit FPU. - Enabled graphite loop optimizer in GCC 4.6 and 4.7 to allow more optimizations:
-fgraphite,-fgraphite-identity,-floop-block,-floop-flatten,
-floop-interchange,-floop-strip-mine,-floop-parallelize-all,
and-ftree-loop-linear.
(info) - Enabled
pollyfor Clang 3.1 on Linux and Max OS X 32-bit hosts which analyzes
and optimizes memory access. (info) - Enabled
-fltoin GCC 4.7, 4.6, Clang 3.2 and Clang 3.1 on linux (Clang LTO
via LLVMgold.so). MIPS compiler targets are not supported becauseld.gold
is not available. - Enabled
--pluginand--plugin-optforld.goldin GCC 4.6/4.7. - Enabled
--text-reorderforld.goldin GCC 4.7. - Configured GNU libstdc++ with
_GLIBCXX_USE_C99_MATHwhich undefines the
isinfscript in the bionic header. For more information, see
CHANGES.html. - Added
APP_LDFLAGSto the build scripts. For more information, see
ANDROID-MK.html. - Updated build scripts to allow
NDK_LOG=0to disable theNDK_LOG. - Updated build scripts to allow
NDK_HOST_32BIT=0to disable the host developer
environment 32-bit toolchain. - Changed the default GCC/X86 flags
-march=and-mtune=from
pentiumproandgenerictoi686andatom. - Enhanced toolchain build scripts:
- Fixed a race condition in
build-gcc.shfor themingwbuild type
which was preventing a significant amount of parallel build processing. - Updated
build-gabi++.shandbuild-stlport.shso they can now run
from the NDK package.
(Issue 52835) - Fixed
run-tests.shin theMSysutilities collection. - Improved 64-bit host toolchain and Canadian Cross build support.
- Updated
build-mingw64-toolchain.shscript to more recent version. - Added option to build
libgnustl_static.aandstlport_static.a
without hidden visibility.
- Fixed a race condition in

- Important changes:
-
- Added the GNU Compiler Collection (GCC) 4.7 compiler to the NDK. The GCC 4.6 compiler
is still the default, so you must to explicitly enable the new version as follows:- For
ndk-build, export theNDK_TOOLCHAIN_VERSION=4.7variable
or add it toApplication.mk. - For standalone builds, add the
--toolchain=option to
make-standalone-toolchain.sh, for example:--toolchain=arm-linux-androideabi-4.7
Note: This feature is experimental. Please try it and
report any issues. - For
- Added
stlportexception support via gabi++. Note that the new gabi++
depends ondlopenand related code, meaning that:- You can no longer build a static executable using the
-static
option or includelibstlport_static.ausing
APP_STL := stlport_static. (You can still use the-staticoption
with a standalone toolchain.) Compiling a dynamic executable using
include $(BUILD_EXECUTABLE)continues to work because the compiler
automatically adds the-ldloption. - If your project links using
-nostdliband {-Wl,—no-undefined}, you
must manually include the-ldloption.
For more information, see
CPLUSPLUS-SUPPORT.html.Note: This feature is experimental and works better with the GCC
4.6/4.7 compilers than with GCC 4.4.3 or Clang 3.1. Please try it and
report any issues. - You can no longer build a static executable using the
- Added a
-mstack-protector-guard=option for x86 to choose between a
global default path which is compatible with older Android C library (bionic)
and a new tls path (%gs:20) for-fstack-protector,
-fstack-protector-alland-fstack-protector-strongusing the GCC 4.6
and higher compilers.Note: The
-mstack-protector-guardsetting itself does not
enable any-fstack-protector*options. - Added
android_setCpu()function to
sources/android/cpufeatures/cpu-features.cfor use when auto-detection via
/procis not possible in Android 4.1 and higher.
(Chromium Issue
164154)
- Added the GNU Compiler Collection (GCC) 4.7 compiler to the NDK. The GCC 4.6 compiler
- Important bug fixes:
-
- Fixed unnecessary rebuild of object files when using the
ndk-buildscript.
(Issue 39810) - Fixed a linker failure with the NDK 8c release for Mac OS X 10.6.x that produced the
following error:dyld: lazy symbol binding failed: Symbol not found: _memmem Referenced from: ...../arm-linux-androideabi/bin/ld Expected in: /usr/lib/libSystem.B.dylib
This problem was caused by building on Mac OS X 10.7, which produced binaries that were
not compatible with Mac OS 10.6.x and the NDK. - Removed the
-x c++options from the Clang++ standalone build script.
(Issue 39089) - Fixed issues using the
NDK_TOOLCHAIN_VERSION=clang3.1option in Cygwin.
(Issue 39585) - Fixed the
make-standalone-toolchain.shscript to allow generation of a
standalone toolchain using the Cygwin or MinGW environments. The resulting toolchain
can be used in Cygwin, MingGW or CMD.exe environments.
(Issue 39915,
Issue 39585) - Added missing
SL_IID_ANDROIDBUFFERQUEUESOURCEoption in android-14 builds for
ARM and X86.
(Issue 40625) - Fixed x86 CPU detection for the
ANDROID_CPU_X86_FEATURE_MOVBEfeature.
(Issue 39317) - Fixed an issue preventing the Standard Template Library (STL) from using C++
sources that do not have a.cppfile extension. - Fixed GCC 4.6 ARM internal compiler error at reload1.c:1061.
(Issue 20862) - Fixed GCC 4.4.3 ARM internal compiler error at emit-rtl.c:1954.
(Issue 22336) - Fixed GCC 4.4.3 ARM internal compiler error at postreload.c:396.
(Issue 22345) - Fixed problem with GCC 4.6/4.7 skipping lambda functions.
(Issue 35933)
- Fixed unnecessary rebuild of object files when using the
- Other bug fixes:
-
- NDK header file fixes:
- Fixed
__WINT_TYPE__andwint_tto be the same type. - Corrected typo in
android/bitmap.h.
(Issue 15134) - Corrected typo in
errno.h. - Added check for the presence of
__STDC_VERSION__insys/cdefs.h.
(Issue 14627) - Reorganized headers in
byteswap.handdirent.h. - Fixed
limits.hto includepage.hwhich providesPAGE_SIZE
settings.
(Issue 39983) - Fixed return type of
glGetAttribLocation()and
glGetUniformLocation()frominttoGLint. - Fixed
__BYTE_ORDERconstant for x86 builds.
(Issue 39824)
- Fixed
- Fixed
ndk-buildscript to not overwrite-Oswith-O2for ARM
builds. - Fixed build scripts to allow overwriting of
HOST_AWK,HOST_SED, and
HOST_MAKEsettings. - Fixed issue for
ld.goldonfsck_msdosbuilds linking objects built by
the Intel C/C++ compiler (ICC). - Fixed ARM EHABI support in Clang to conform to specifications.
- Fixed GNU Debugger (GDB) to shorten the time spent on walking the target’s link map
duringsolibevents.
(Issue 38402) - Fixed missing
libgcc.afile when linking shared libraries.
- NDK header file fixes:
- Other changes:
-
- Backported 64-bit built-in atomic functions for ARM to GCC 4.6.
- Added documentation for audio output latency, along with other documentation and
fixes. - Fixed debug builds with Clang so that non-void functions now raise a
SIGILL
signal for paths without a return statement. - Updated
make-standalone-toolchain.shto accept the suffix-clang3.1
which is equivalent to adding--llvm-version=3.1to the GCC 4.6 toolchain. - Updated GCC and Clang bug report URL to:
http://source.android.com/source/report-bug
s.html - Added ARM ELF support to
llvm-objdump. - Suppressed treating c input as c++ warning for Clang builds.
- Updated build so that only the 32-bit version of
libiberty.ais built and
placed inlib32/.

- Important changes:
-
- Added the Clang 3.1 compiler to the NDK. The GNU Compiler Collection (GCC) 4.6 is
still the default, so you must explicitly enable the Clang compiler option as follows:- For
ndk-build, exportNDK_TOOLCHAIN_VERSION=clang3.1or
add this environment variable setting toApplication.mk. - For standalone builds, add
--llvm-version=3.1to
make-standalone-toolchain.shand replaceCCandCXXin your
makefile with<tool-path>/bin/clangand
<tool-path>/bin/clang++. SeeSTANDALONE-TOOLCHAIN.htmlfor
details.
Note: This feature is experimental. Please try it and
report any issues. - For
- Added Gold linker
ld.goldfor the Windows toolchain. Gold linker is also the
default for ARM and X86 on all hosts. You may override it to use theld.bfd
linker by addingLOCAL_LDFLAGS += -fuse-ld=bfdtoAndroid.mk, or by
passing
-fuse-ld=bfdto the g++/clang++ command line that does the linking. - Added checks for spaces in the NDK path to the
ndk-build[.cmd]and
ndk-gdbscripts, to prevent build errors that are difficult to diagnose. - Made the following changes to API level handling:
- Modified build logic so that projects that specify
android-10through
android-13inAPP_PLATFORM,project.propertiesor
default.propertieslink againstandroid-9instead of
android-14. - Updated build so that executables using android-16 (Jelly Bean) or higher are
compiled with the-fPIEoption for position-independent executables (PIE).
A newAPP_PIEoption allows you to control this behavior. SeeAPPLICATION-MK.htmlfor details.Note: All API levels above 14 still link against
platforms/android-14and no newplatforms/android-Nhave been added. - Modified
ndk-buildto provide warnings if the adjusted API level is larger
thanandroid:minSdkVersionin the project’sAndroidManifest.xml.
- Modified build logic so that projects that specify
- Updated the
cpu-featureshelper library to include more ARM-specific features.
Seesources/android/cpufeatures/cpu-features.hfor details. - Modified the long double on the X86 platform to be 8 bytes. This data type is now the
same size as a double, but is still treated as a distinct type. - Updated build for
APP_ABI=armeabi-v7a:- Modified this build type to pass the
-march=armv7-aparameter
to the linker. This change ensures that v7-specific libraries andcrt*.oare
linked correctly. - Added
-mfpu=vfpv3-d16tondk-buildinstead of the
-mfpu=vfpoption used in previous releases.
- Modified this build type to pass the
- Added the Clang 3.1 compiler to the NDK. The GNU Compiler Collection (GCC) 4.6 is
- Important bug fixes:
-
- Fixed an issue where running
make-standalone-toolchain.shwith root privileges
resulted in the stand alone tool chain being inaccessible to some users.
(Issue 35279)- All files and executables in the NDK release package are set to have read and
execute permissions for all. - The ownership/group of
libstdc++.ais now preserved when copied.
- All files and executables in the NDK release package are set to have read and
- Removed redundant
rfrom Windows prebuiltecho.exe. The redundant
rcausedgdb.setupto fail in the GNU Debugger (GDB) because it
incorrectly became part of the path.
(Issue 36054) - Fixed Windows parallel builds that sometimes failed due to timing issues in the
host-mkdirimplementation.
(Issue 25875) - Fixed GCC 4.4.3 GNU
libstdc++to not mergetypeinfonames by
default. For more details, see
toolchain repo gcc/gcc-4.4.3/libstdc++-v3/libsupc++/typeinfo.
(Issue 22165) - Fixed problem on
nullcontext in GCC 4.6
cp/mangle.c::write_unscoped_name, where GCC may crash when the context is
nulland dereferenced inTREE_CODE. - Fixed GCC 4.4.3 crashes on ARM NEON-specific type definitions for floats.
(Issue 34613) - Fixed the
STLportinternal_IteWrapper::operator*()implementation
where a stale stack location holding the dereferenced value was returned and caused
runtime crashes.
(Issue 38630) - ARM-specific fixes:
- Fixed ARM GCC 4.4.3/4.6
g++to not warn that the mangling of
<va_list> was changed in GCC 4.4. The workaround using the
-Wno-psabiswitch to avoid this warning is no longer required. - Fixed an issue when a project with
.armor.neonsuffixes in
LOCAL_SRC_FILESalso usedAPP_STL. WithAPP_STL, the
ndk-buildscript searches for C++ files inLOCAL_SRC_FILESbefore
adding STLheader/libpaths to compilation. Modifiedndk-buildto
filter out.armand.neonsuffixes before the search, otherwise items
inLOCAL_SRC_FILESlikemyfile.cpp.arm.neonwon’t be compiled as C++
code. - Fixed
binutils-2.21/ld.bfdto be capable of linking object from older
binutils withouttag_FP_arch, which was producing assertion fail
error messages in GNU Binutils.
(Issue 35209) - Removed Unknown EABI object attribute 44 warning when
binutils-2.19/ldlinks prebuilt object by newerbinutils-2.21 - Fixed an issue in GNU
stdc++compilation with both-mthumband
-march=armv7-a, by modifyingmake-standalone-toolchain.shto populate
headers/libsin sub-directoryarmv7-a/thumb.
(Issue 35616) - Fixed unresolvable R_ARM_THM_CALL relocation error.
(Issue 35342) - Fixed internal compiler error at
reload1.c:3633, caused by the ARM
back-end expecting the wrong operand type when sign-extend fromchar.
(GCC Issue 50099) - Fixed internal compiler error with negative shift amount.
(GCC Issue)
- Fixed ARM GCC 4.4.3/4.6
- Fixed
-fstack-protectorfor X86, which is also the default for the
ndk-buildx86 ABI target. - MIPS-specific fixes:
- Fixed
STLportendian-ness by setting_STLP_LITTLE_ENDIANto 1 when
compiling MIPSlibstlport_*. - Fixed GCC
__builtin_unreachableissue when compiling LLVM.
(GCC Issue 54369) - Backported fix for
cc1compile process consuming 100% CPU.
(GCC Issue 50380)
- Fixed
- GNU Debugger-specific fixes:
- Disabled Python support in gdb-7.x at build, otherwise the gdb-7.x configure
function may pick up whatever Python version is available on the host and build
gdbwith a hard-wired dependency on a specific version of Python.
(Issue 36120) - Fixed
ndk-gdbwhenAPP_ABIcontainsalland matchs none
of the known architectures.
(Issue 35392) - Fixed Windows pathname support, by keeping the
:character if it looks
like it could be part of a Windows path starting with a drive letter.
(GDB Issue 12843) - Fixed adding of hardware breakpoint support for ARM in
gdbserver.
(GDB Issue) - Added fix to only read the current
solibswhen the linker is consistent.
This change speeds upsolibevent handling.
(Issue 37677) - Added fix to make repeated attempts to find
solibbreakpoints. GDB now
retriesenable_break()during every call tosvr4_current_sos()until
it succeeds.
(Change 43563) - Fixed an issue where
gdbwould not stop on breakpoints placed in
dlopen-edlibraries.
(Issue 34856) - Fixed
SIGILLin dynamic linker when callingdlopen(), on system
where/system/bin/linkeris stripped of symbols and
rtld_db_dlactivity()is implemented asThumb, due to not preserving
LSBofsym_addr.
(Issue 37147)
- Disabled Python support in gdb-7.x at build, otherwise the gdb-7.x configure
- Fixed an issue where running
- Other bug fixes:
-
- Fixed NDK headers:
- Fixed
arch-mips/include/asm/*code that was incorrectly removed from
original kernel. (Change
43335) - Replaced struct member data
__unusedwith__linux_unusedin
linux/sysctl.handlinux/icmp.hto avoid conflict with
#define __unusedinsys/cdefs.h. - Fixed
fenv.hfor enclosed C functions with__BEGIN_DECLSand
__END_DECLS. - Removed unimplemented functions in
malloc.h. - Fixed
stdint.hdefintion ofuint64_tfor ANSI compilers.
(Issue 1952) - Fixed preprocessor macros in
<arch>/include/machine/*. - Replaced
link.hfor MIPS with new version supporting all platforms. - Removed
linux-unistd.h - Move GLibc-specific macros
LONG_LONG_MIN,LONG_LONG_MAXand
ULONG_LONG_MAXfrom<pthread.h>to<limits.h>.
- Fixed
- Fixed a buffer overflow in
ndk-stack-parser. - Fixed
_STLP_USE_EXCEPTIONS, when not defined, to omit all declarations
and uses of__Named_exception. Compiling and use of__Named_exception
settings only occurs whenSTLportis allowed to use exceptions. - Fixed building of Linux-only NDK packages without also building Windows code. Use the
following settings to perform this type of build:./build/tools/make-release.sh --force --systems=linux-x86
- Fixed
libc.soso it does not exportatexit()and__do_handler.
These symbols are exported for ARM builds by the system version of the C library to
support legacy native libraries. NDK-generated should never reference them directly.
Instead, each shared library or executable should embed its own version of these symbols,
provided bycrtbegin_*.o.If your project is linked with the
-nostdlib -Wl,--no-undefinedoptions, you
must provide your own__dso_handlebecausecrtbegin_so.ois not linked in
this case. The content of__dso_handledoes not matter, as shown in the following
example code:extern "C" { extern void *__dso_handle __attribute__((__visibility__ ("hidden"))); void *__dso_handle; } - Fixed symbol decoder for ARM used in
objdumpforpltentries to
generate a more readable formfunction@plt. - Removed the following symbols, introduced in GCC 4.6
libgcc.a, from
the X86 platformlibc.solibrary:__aeabi_idiv0,__aeabi_ldiv0,
__aeabi_unwind_cpp_pr1, and__aeabi_unwind_cpp_pr2. - Removed unused
.ctors,.dtors, and.eh_framein MIPS
crt*_so.S. - Updated
ndk-gdbso that it only takes the last line of output for
ndk-buildDUMP_XXXX. This change ensures that ifApplication.mkor
Android.mkprint something with$(info ...)syntax, it does not get
injected into the result ofDUMP_XXXX.
(More info)
- Fixed NDK headers:
- Other changes:
-
- Removed
arch-x86andarch-mipsheaders from
platforms/android-[3,4,5,8]. Those headers were incomplete, since both X86 and
MIPS ABIs are only supported at API 9 or higher. - Simplified c++ include path in standalone packages, as shown below.
(Issue 35279)<path>/arm-linux-androideabi/include/c++/4.6.x-google to: <path>/include/c++/4.6/
- Fixed
ndk-buildto recognize more C++ file extensions by default:
.cc .cp .cxx .cpp .CPP .c++ .C. You may still useLOCAL_CPP_EXTENSIONto
overwrite these extension settings. - Fixed an issue in
samples/san-angelesthat caused a black screen or freeze
frame on re-launch. - Replaced deprecated APIs in NDK samples.
(Issue 20017)hello-gl2from android-5 to android-7native-activityfrom android-9 to android-10native-audiofrom android-9 to android-10native-plasmafrom android-9 to android-10
- Added new branding for Android executables with a simpler scheme in section
.note.android.ident(defined incrtbegin_static/dynamic.o) so that
debugging tools can act accordingly. The structure member and values are defined as
follows:static const struct { int32_t namesz; /* = 8, sizeof ("Android") */ int32_t descsz; /* = 1 * sizeof(int32_t) */ int32_t type; /* = 1, ABI_NOTETYPE */ char name[sizeof "Android"]; /* = "Android" */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }The previous branding options in section
.note.ABI-tagare deprecated. - Added a new script
run-tests-all.shwhich callsrun-tests.shand
standalone/run.shwith various conditions. The scriptrun-tests.shruns
without the--abioption, and is enhanced to compile most of the tests for all
supported ABIs and run on all attached devices
- Removed

The main features of this release are a new GNU Compiler Collection (GCC) 4.6 toolchain and
GNU Debugger (GDB) 7.3.x which adds debugging support for the Android 4.1 (API Level 16) system
image.
- Important bug fixes:
-
- Fixed
LOCAL_SHORT_COMMANDSissues on Mac OS, Windows Cygwin environments for
static libraries. List file generation is faster, and it is not regenerated to avoid repeated
project rebuilds. - Fixed several issues in
ndk-gdb:- Updated tool to pass flags
-e,-dand-sto adb more
consistently. - Updated tool to accept device serial names containing spaces.
- Updated tool to retrieve
/system/bin/linkinformation, sogdbon
the host can set a breakpoint in__dl_rtld_db_dlactivityand be aware of linker activity
(e.g., rescansolibsymbols whendlopen()is called).
- Updated tool to pass flags
- Fixed
ndk-build cleanon Windows, which was failing to remove
./libs/*/lib*.so. - Fixed
ndk-build.cmdto return a non-zeroERRORLEVELwhenmake
fails. - Fixed
libc.soto stop incorrectly exporting the__exidx_startand
__exidx_endsymbols. - Fixed
SEGVwhen unwinding the stack past__libc_initfor ARM and
MIPS.
- Fixed
- Important changes:
-
- Added GCC 4.6 toolchain (
binutils2.21 withgoldand GDB 7.3.x) to
co-exist with the original GCC 4.4.3 toolchain (binutils2.19 and GDB 6.6).- GCC 4.6 is now the default toolchain. You may set
NDK_TOOLCHAIN_VERSION=4.4.3inApplication.mkto select the original one. - Support for the
goldlinker is only available for ARM and x86
architectures on Linux and Mac OS hosts. This support is disabled by default. AddLOCAL_LDLIBS += -fuse-ld=goldinAndroid.mkto enable it. - Programs compiled with
-fPIErequire the newGDBfor debugging,
including binaries in Android 4.1 (API Level 16) system images. - The
binutils2.21ldtool contains back-ported fixes from
version 2.22:- Fixed
ld --gc-sections, which incorrectly retains zombie references to
external libraries. (more
info). - Fixed ARM
stripcommand to preserve the originalp_alignand
p_flagsinGNU_RELROsection if they are valid. Without this fix, programs
built with-fPIEcould not be debugged. (mor
e info)
- Fixed
- Disabled
sincos()optimization for compatibility with older
platforms.
- GCC 4.6 is now the default toolchain. You may set
- Updated build options to enable the Never eXecute (NX) bit and
relro/bind_nowprotections by default:- Added
--noexecstackto assembler and-z noexecstackto linker
that provides NX protection against buffer overflow attacks by enabling NX bit on stack and
heap. - Added
-z relroand-z nowto linker for hardening of internal
data sections after linking to guard against security vulnerabilities caused by memory corruption.
(more info: 1,
2) - These features can be disabled using the following options:
- Disable NX protection by setting the
--execstackoption for the
assembler and-z execstackfor the linker. - Disable hardening of internal data by setting the
-z norelroand
-z lazyoptions for the linker. - Disable these protections in the NDK
jni/Android.mkby setting the
following options:LOCAL_DISABLE_NO_EXECUTE=true # disable "--noexecstack" and "-z noexecstack" DISABLE_RELRO=true # disable "-z relro" and "-z now"
See
docs/ANDROID-MK.htmlfor more details. - Disable NX protection by setting the
- Added
- Added branding for Android executables with the
.note.ABI-tagsection (in
crtbegin_static/dynamic.o) so that debugging tools can act accordingly. The structure
member and values are defined as follows:static const struct { int32_t namesz; /* = 4, sizeof ("GNU") */ int32_t descsz; /* = 6 * sizeof(int32_t) */ int32_t type; /* = 1 */ char name[sizeof "GNU"]; /* = "GNU" */ int32_t os; /* = 0 */ int32_t major; /* = 2 */ int32_t minor; /* = 6 */ int32_t teeny; /* = 15 */ int32_t os_variant; /* = 1 */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
- Added GCC 4.6 toolchain (
- Other bug fixes:
-
- Fixed
mips-linux-gnurelocation truncated to fitR_MIPS_TLS_LDMissue.
(more info) - Fixed
ldtool segfaults when using--gc-sections.
(more info) - Fixed MIPS
GOT_PAGEcounting issue.
(more info) - Fixed follow warning symbol link for
mips_elf_count_got_symbols. - Fixed follow warning symbol link for
mips_elf_allocate_lazy_stub. - Moved MIPS
.dynamicto the data segment, so that it is writable. - Replaced hard-coded values for symbols with correct segment sizes for MIPS.
- Removed the
-mno-sharedoption from the defaults in the MIPS toolchain.
The default for Android toolchain is-fPIC(or-fpicif supported). If you do not
explicitly specify-mshared,-fpic,-fPIC,-fpie, or-fPIE,
the MIPS compiler adds-mno-sharedthat turns off PIC. Fixed compiler not to add
-mno-sharedin this case. - Fixed wrong package names in samples
hello-jniandtwo-libsso that
thetestsproject underneath it can compile.
- Fixed
- Other Changes:
-
- Changed locations of binaries:
- Moved
gdbserverfrom
toolchain/<arch-os-ver>/prebuilt/gdbserverto
prebuilt/android-<arch>/gdbserver/gdbserver. - Renamed x86 toolchain prefix from
i686-android-linux-to
i686-linux-android-. - Moved
sources/cxx-stl/gnu-libstdc++/includeandlibto
sources/cxx-stl/gnu-libstdc++/4.6when compiled with GCC 4.6, or
sources/cxx-stl/gnu-libstdc++/4.4.3when compiled with GCC 4.4.3. - Moved
libbfd.aandlibintl.afromlib/tolib32/.
- Moved
- Added and improved various scripts in the rebuild and test NDK toolchain:
- Added
build-mingw64-toolchain.shto generate a new Linux-hosted toolchain
that generates Win32 and Win64 executables. - Improved speed of
download-toolchain-sources.shby using theclonecommand and only usingcheckoutfor the directories that are needed to build the NDK
toolchain binaries. - Added
build-host-gcc.shandbuild-host-gdb.shscripts. - Added
tests/check-release.shto check the content of a given NDK
installation directory, or an existing NDK package. - Rewrote the
tests/standalone/run.shstandalone tests .
- Added
- Removed
if_dl.hheader from all platforms and architectures. TheAF_LINKandsockaddr_dlelements it describes are specific to BSD (i.e., they don’t exist
in Linux).
- Changed locations of binaries:

This release of the NDK includes support for MIPS ABI and a few additional fixes.
- New features:
-
- Added support for the MIPS ABI, which allows you to generate machine code that runs on
compatible MIPS-based Android devices. Major features for MIPS include MIPS-specific
toolchains, system headers, libraries and debugging support. For more details regarding
MIPS support, seedocs/CPU-MIPS.htmlin the NDK package.By default, code is generated for ARM-based devices. You can add
mipsto
yourAPP_ABIdefinition in yourApplication.mkfile to build
for MIPS platforms. For example, the following line instructsndk-build
to build your code for three distinct ABIs:APP_ABI := armeabi armeabi-v7a mips
Unless you rely on architecture-specific assembly sources, such as ARM assembly
code, you should not need to touch yourAndroid.mkfiles to build MIPS
machine code. - You can build a standalone MIPS toolchain using the
--arch=mips
option when callingmake-standalone-toolchain.sh. See
docs/STANDALONE-TOOLCHAIN.htmlfor more details.
Note: To ensure that your applications are available
to users only if their devices are capable of running them, Google Play filters applications based
on the instruction set information included in your application ? no action is needed on your part
to enable the filtering. Additionally, the Android system itself also checks your application at
install time and allows the installation to continue only if the application provides a library that
is compiled for the device’s CPU architecture. - Added support for the MIPS ABI, which allows you to generate machine code that runs on
- Important bug fixes:
-
- Fixed a typo in GAbi++ implementation where the result of
dynamic_cast<D>(b)of base class objectbto derived classDis
incorrectly adjusted in the opposite direction from the base class.
(Issue 28721) - Fixed an issue in which
make-standalone-toolchain.shfails to copy
libsupc++.*.
- Fixed a typo in GAbi++ implementation where the result of
- Other bug fixes:
-
- Fixed
ndk-build.cmdto ensure thatndk-build.cmdworks correctly even
if the user has redefined theSHELLenvironment variable, which may be changed
when installing a variety of development tools in Windows environments.
- Fixed

This release of the NDK includes an important fix for Tegra2-based devices, and a few
additional fixes and improvements:
- Important bug fixes:
-
- Fixed GNU STL armeabi-v7a binaries to not crash on non-NEON
devices. The files provided with NDK r7b were not configured properly,
resulting in crashes on Tegra2-based devices and others when trying to use
certain floating-point functions (e.g.,cosf,sinf,expf).
- Fixed GNU STL armeabi-v7a binaries to not crash on non-NEON
- Important changes:
-
- Added support for custom output directories through the
NDK_OUT
environment variable. When defined, this variable is used to store all
intermediate generated files, instead of$PROJECT_PATH/obj. The variable is
also recognized byndk-gdb. - Added support for building modules with hundreds or even thousands of source
files by definingLOCAL_SHORT_COMMANDStotruein yourAndroid.mk.This change forces the NDK build system to put most linker or archiver options
into list files, as a work-around for command-line length limitations.
Seedocs/ANDROID-MK.htmlfor details.
- Added support for custom output directories through the
- Other bug fixes:
-
- Fixed
android_getCpuCount()implementation in thecpufeatures
helper library. On certain devices, where cores are enabled dynamically by the system, the previous
implementation would report the total number of active cores the first time the function
was called, rather than the total number of physically available cores.
- Fixed

This release of the NDK includes fixes for native Windows builds, Cygwin and many other
improvements:
- Important bug fixes:
-
- Updated
sys/atomics.hto avoid correctness issues
on some multi-core ARM-based devices. Rebuild your unmodified sources with this
version of the NDK and this problem should be completely eliminated.
For more details, readdocs/ANDROID-ATOMICS.html. - Reverted to
binutils2.19 to fix debugging issues that
appeared in NDK r7 (which switched tobinutils2.20.1). - Fixed
ndk-buildon 32-bit Linux. A packaging error put a 64-bit version
of theawkexecutable underprebuilt/linux-x86/binin NDK r7. - Fixed native Windows build (
ndk-build.cmd). Other build modes were not
affected. The fixes include:- Removed an infinite loop / stack overflow bug that happened when trying
to callndk-build.cmdfrom a directory that was not the top of
your project path (e.g., in any sub-directory of it). - Fixed a problem where the auto-generated dependency files were ignored. This
meant that updating a header didn’t trigger recompilation of sources that included
it. - Fixed a problem where special characters in files or paths, other than spaces and
quotes, were not correctly handled.
- Removed an infinite loop / stack overflow bug that happened when trying
- Fixed the standalone toolchain to generate proper binaries when using
-lstdc++(i.e., linking against the GNUlibstdc++C++ runtime). You
should use-lgnustl_sharedif you want to link against the shared library
version or-lstdc++for the static version.See
docs/STANDALONE-TOOLCHAIN.htmlfor more details about this fix. - Fixed
gnustl_sharedon Cygwin. The linker complained that it couldn’t find
libsupc++.aeven though the file was at the right location. - Fixed Cygwin C++ link when not using any specific C++ runtime through
APP_STL.
- Updated
- Other changes:
-
- When your application uses the GNU
libstdc++runtime, the compiler will
no longer forcibly enable exceptions and RTTI. This change results in smaller code.If you need these features, you must do one of the following:
- Enable exceptions and/or RTTI explicitly in your modules or
Application.mk. (recommended) - Define
APP_GNUSTL_FORCE_CPP_FEATURESto'exceptions',
'rtti'or both in yourApplication.mk. See
docs/APPLICATION-MK.htmlfor more details.
- Enable exceptions and/or RTTI explicitly in your modules or
ndk-gdbnow works properly when your application has private services
running in independent processes. It debugs the main application process, instead of the
first process listed byps, which is usually a service process.- Fixed a rare bug where NDK r7 would fail to honor the
LOCAL_ARM_MODEvalue
and always compile certain source files (but not all) to 32-bit instructions. STLport: Refresh the sources to match the Android platform version. This
update fixes a few minor bugs:- Fixed instantiation of an incomplete type
- Fixed minor «==» versus «=» typo
- Used
memmoveinstead ofmemcpyinstring::assign - Added better handling of
IsNANorINF,IsINF,IsNegNAN,
etc.
For complete details, see the commit log.
STLport: Removed 5 unnecessary static initializers from the library.- The GNU libstdc++ libraries for armeabi-v7a were mistakenly compiled for
armeabi instead. This change had no impact on correctness, but using the right
ABI should provide slightly better performance. - The
cpu-featureshelper library was updated to report three optional
x86 CPU features (SSSE3,MOVBEandPOPCNT). See
docs/CPU-FEATURES.htmlfor more details. docs/NDK-BUILD.htmlwas updated to mentionNDK_APPLICATION_MKinstead
ofNDK_APP_APPLICATION_MKto select a customApplication.mkfile.- Cygwin:
ndk-buildno longer creates an empty «NUL» file in the current
directory when invoked. - Cygwin: Added better automatic dependency detection. In the previous version, it
didn’t work properly in the following cases:- When the Cygwin drive prefix was not
/cygdrive. - When using drive-less mounts, for example, when Cygwin would translate
/hometo\serversubdirinstead ofC:SomeDir.
- When the Cygwin drive prefix was not
- Cygwin:
ndk-builddoes not try to use the native Windows tools under
$NDK/prebuilt/windows/binwith certain versions of Cygwin and/or GNU Make.
- When your application uses the GNU

This release of the NDK includes new features to support the Android 4.0 platform as well
as many other additions and improvements:
- New features
-
- Added official NDK APIs for Android 4.0 (API level 14), which adds the following
native features to the platform:- Added native multimedia API based on the Khronos Group OpenMAX AL? 1.0.1
standard. The new<OMXAL/OpenMAXAL.h>and
<OMXAL/OpenMAXAL_Android.h>headers allow applications targeting
API level 14 to perform multimedia output directly from native code by using a new
Android-specific buffer queue interface. For more details, see
docs/openmaxal/index.htmland http://www.khronos.org/openmax/. - Updated the native audio API based on the Khronos Group OpenSL ES 1.0.1?
standard. With API Level 14, you can now decode compressed audio (e.g. MP3, AAC,
Vorbis) to PCM. For more details, seedocs/opensles/index.htmland
http://www.khronos.org/opensles/.
- Added native multimedia API based on the Khronos Group OpenMAX AL? 1.0.1
- Added CCache support. To speed up large rebuilds, define the
NDK_CCACHEenvironment variable toccache(or the path to
yourccachebinary). When declared, the NDK build system automatically
uses CCache when compiling any source file. For example:export NDK_CCACHE=ccache
Note: CCache is not included in the NDK release
so you must have it installed prior to using it. For more information about CCache, see
http://ccache.samba.org. - Added support for setting
APP_ABItoallto indicate that
you want to build your NDK modules for all the ABIs supported by your given NDK
release. This means that either one of the following two lines in your
Application.mkare equivalent with this release:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
This also works if you define
APP_ABIwhen calling
ndk-buildfrom the command-line, which is a quick way to check that your
project builds for all supported ABIs without changing the project’s
Application.mk file. For example:ndk-build APP_ABI=all
- Added a
LOCAL_CPP_FEATURESvariable inAndroid.mkthat
allows you to declare which C++ features (RTTI or Exceptions) your module uses. This
ensures that the final linking works correctly if you have prebuilt modules that depend
on these features. Seedocs/ANDROID-MK.htmland
docs/CPLUSPLUS-SUPPORT.htmlfor more details. - Shortened paths to source and object files that are used in build commands. When
invoking$NDK/ndk-buildfrom your project path, the paths to the source,
object, and binary files that are passed to the build commands are significantly
shorter now, because they are passed relative to the current directory. This is useful
when building projects with a lot of source files, to avoid limits on the maximum
command line length supported by your host operating system. The behavior is unchanged
if you invokendk-buildfrom a sub-directory of your project tree, or if
you defineNDK_PROJECT_PATHto point to a specific directory.
- Added official NDK APIs for Android 4.0 (API level 14), which adds the following
- Experimental features
-
You can now build your NDK source files on Windows without Cygwin by calling the
ndk-build.cmdscript from the command line from your project path. The
script takes exactly the same arguments as the originalndk-buildscript.
The Windows NDK package comes with its own prebuilt binaries for GNU Make, Awk and other
tools required by the build. You should not need to install anything else to get a
working build system.Important:
ndk-gdbdoes not work on
Windows, so you still need Cygwin to debug.This feature is still experimental, so feel free to try it and report issues on the
public bug database or public forum. All samples and unit tests
shipped with the NDK succesfully compile with this feature. - Important bug fixes
-
- Imported shared libraries are now installed by default to the target installation
location (libs/<abi>) ifAPP_MODULESis not defined in
yourApplication.mk. For example, if a top-level modulefoo
imports a modulebar, then bothlibfoo.soand
libbar.soare copied to the install location. Previously, only
libfoo.sowas copied, unless you listedbarin your
APP_MODULEStoo. If you defineAPP_MODULESexplicitly, the
behavior is unchanged. ndk-gdbnow works correctly for activities with multiple categories in
their MAIN intent filters.- Static library imports are now properly transitive. For example, if a top-level
modulefooimports static librarybarthat imports static
libraryzoo, thelibfoo.sowill now be linked against both
libbar.aandlibzoo.a.
- Imported shared libraries are now installed by default to the target installation
- Other changes
-
docs/NATIVE-ACTIVITY.HTML: Fixed typo. The minimum API level should be
9, not 8 for native activities.docs/STABLE-APIS.html: Added missing documentation listing EGL as a
supported stable API, starting from API level 9.download-toolchain-sources.sh: Updated to download the toolchain
sources from android.googlesource.com,
which is the new location for the AOSP servers.- Added a new C++ support runtime named
gabi++. More details about it
are available in the updateddocs/CPLUSPLUS-SUPPORT.html. - Added a new C++ support runtime named
gnustl_sharedthat corresponds
to the shared library version of GNU libstdc++ v3 (GPLv3 license). See more info at
docs/CPLUSPLUS-SUPPORT.html - Added support for RTTI in the STLport C++ runtimes (no support for
exceptions). - Added support for multiple file extensions in
LOCAL_CPP_EXTENSION. For
example, to compile bothfoo.cppandbar.cxxas C++ sources,
declare the following:LOCAL_CPP_EXTENSION := .cpp .cxx
- Removed many unwanted exported symbols from the link-time shared system libraries
provided by the NDK. This ensures that code generated with the standalone toolchain
doesn’t risk to accidentally depend on a non-stable ABI symbol (e.g. any libgcc.a
symbol that changes each time the toolchain used to build the platform is changed) - Refreshed the EGL and OpenGLES Khronos headers to support more extensions. Note
that this does not change the NDK ABIs for the corresponding libraries,
because each extension must be probed at runtime by the client application.The extensions that are available depend on your actual device and GPU drivers,
not the platform version the device runs on. The header changes simply add new
constants and types to make it easier to use the extensions when they have been
probed witheglGetProcAddress()orglGetProcAddress(). The
following list describes the newly supported extensions:- GLES 1.x
-
GL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_APPLE_texture_2D_limited_npotGL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_filter_anisotropicGL_EXT_texture_format_BGRA8888GL_EXT_texture_lod_biasGL_IMG_read_formatGL_IMG_texture_compression_pvrtcGL_IMG_texture_env_enhanced_fixed_functionGL_IMG_user_clip_planeGL_IMG_multisampled_render_to_textureGL_NV_fenceGL_QCOM_driver_controlGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_perfmon_global_modeGL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uintGL_OES_get_program_binaryGL_OES_mapbufferGL_OES_packed_depth_stencilGL_OES_texture_3DGL_OES_texture_floatGL_OES_texture_float_linearGL_OES_texture_half_float_linearGL_OES_texture_npotGL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_AMD_program_binary_Z400GL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_format_BGRA8888GL_EXT_texture_compression_dxt1GL_IMG_program_binaryGL_IMG_read_formatGL_IMG_shader_binaryGL_IMG_texture_compression_pvrtcGL_IMG_multisampled_render_to_textureGL_NV_coverage_sampleGL_NV_depth_nonlinearGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordableEGL_NV_system_time

This release of the NDK does not include any new features compared to r6. The r6b release
addresses the following issues in the r6 release:
- Important bug fixes
-
- Fixed the build when
APP_ABI="armeabi x86"is used for
multi-architecture builds. - Fixed the location of prebuilt STLport binaries in the NDK release package.
A bug in the packaging script placed them in the wrong location. - Fixed
atexit()usage in shared libraries with the x86standalone
toolchain. - Fixed
make-standalone-toolchain.sh --arch=x86. It used to fail
to copy the proper GNU libstdc++ binaries to the right location. - Fixed the standalone toolchain linker warnings about missing the definition and
size for the__dso_handlesymbol (ARM only). - Fixed the inclusion order of
$(SYSROOT)/usr/includefor x86 builds.
See the bug for
more information. - Fixed the definitions of
ptrdiff_tandsize_tin
x86-specific systems when they are used with the x86 standalone toolchain.
- Fixed the build when

This release of the NDK includes support for the x86 ABI and other minor changes.
For detailed information describing the changes in this release, read the
CHANGES.HTML document included in the NDK package.
- General notes:
-
- Adds support for the x86 ABI, which allows you to generate machine code
that runs on compatible x86-based Android devices. Major features for x86
include x86-specific toolchains, system headers, libraries and
debugging support. For all of the details regarding x86 support,
seedocs/CPU-X86.htmlin the NDK package.By default, code is generated for ARM-based devices, but you can add x86 to your
APP_ABIdefinition in yourApplication.mkfile to build
for x86 platforms. For example, the following line instructsndk-build
to build your code for three distinct ABIs:APP_ABI := armeabi armeabi-v7a x86
Unless you rely on ARM-based assembly sources, you shouldn’t need to touch
yourAndroid.mkfiles to build x86 machine code. - You can build a standalone x86 toolchain using the
--toolchain=x86-4.4.3
option when callingmake-standalone-toolchain.sh. See
docs/STANDALONE-TOOLCHAIN.htmlfor more details. - The new
ndk-stacktool lets you translate stack traces in
logcatthat are generated by native code. The tool translates
instruction addresses into a readable format that contains things such
as the function, source file, and line number corresponding to each stack frame.
For more information and a usage example, seedocs/NDK-STACK.html.
- Adds support for the x86 ABI, which allows you to generate machine code
- Other changes:
arm-eabi-4.4.0, which had been deprecated since NDK r5, has been
removed from the NDK distribution.

This release of the NDK does not include any new features compared to r5b. The r5c release
addresses the following problems in the r5b release:
- Important bug fixes:
-
ndk-build: Fixed a rare bug that appeared when trying to perform parallel
builds of debuggable projects.- Fixed a typo that prevented
LOCAL_WHOLE_STATIC_LIBRARIESto work
correctly with the new toolchain and added documentation for this in
docs/ANDROID-MK.html. - Fixed a bug where code linked against
gnustl_staticcrashed when run on
platform releases older than API level 8 (Android 2.2). ndk-gdb: Fixed a bug that caused a segmentation fault when debugging
Android 3.0
or newer devices.<android/input.h>: Two functions that were introduced in API level
9 (Android 2.3) were incorrect and are fixed. While this breaks the source API, the
binary interface to the system is unchanged. The incorrect functions were missing a
history_indexparameter, and the correct definitions are shown below:float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index, size_t history_index); float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index, size_t history_index);- Updated the C library ARM binary for API level 9 (Android 2.3) to correctly expose at
link time new functions that were added in that API level (for example,
pthread_rwlock_init).
- Minor improvements and fixes:
-
- Object files are now always linked in the order they appear in
LOCAL_SRC_FILES. This was not the case previously because the files were
grouped by source extensions instead. - When
import-modulefails, it now prints the list of directories that
were searched. This is useful to check that theNDK_MODULE_PATHdefinition
used by the build system is correct. - When
import-modulesucceeds, it now prints the directory where the
module was found to the log (visible withNDK_LOG=1). - Increased the build speed of debuggable applications when there is a very large number
of include directories in the project. ndk-gdb: Better detection ofadb shellfailures and improved
error messages.<pthread.h>: Fixed the definition of
PTHREAD_RWLOCK_INITIALIZERfor API level 9 (Android 2.3) and higher.- Fixed an issue where a module could import itself, resulting in an infinite loop in
GNU Make. - Fixed a bug that caused the build to fail if
LOCAL_ARM_NEONwas set to
true (typo inbuild/core/build-binary.mk). - Fixed a bug that prevented the compilation of
.sassembly files
(.Sfiles were okay).
- Object files are now always linked in the order they appear in

This release of the NDK does not include any new features compared to r5. The r5b release
addresses the
following problems in the r5 release:
- The r5 binaries required glibc 2.11, but the r5b binaries are generated with a special
toolchain that targets glibc 2.7 or higher instead. The Linux toolchain binaries now run on
Ubuntu 8.04 or higher. - Fixes a compiler bug in the arm-linux-androideabi-4.4.3 toolchain.
The previous binary generated invalid thumb instruction sequences when
dealing with signed chars. - Adds missing documentation for the
«gnustl_static» value for APP_STL, that allows you to link against
a static library version of GNU libstdc++. - Fixed the following
ndk-buildissues:- A bug that created inconsistent dependency files when a
compilation error occured on Windows. This prevented a proper build after
the error was fixed in the source code. - A Cygwin-specific bug where using very short paths for
the Android NDK installation or the project path led to the
generation of invalid dependency files. This made incremental builds
impossible. - A typo that prevented the cpufeatures library from working correctly
with the new NDK toolchain. - Builds in Cygwin are faster by avoiding calls to
cygpath -m
from GNU Make for every source or object file, which caused problems
with very large source trees. In case this doesn’t work properly, define
NDK_USE_CYGPATH=1in your
environment to usecygpath -magain. - The Cygwin installation now notifies the user of invalid installation paths that
contain spaces. Previously, an invalid path
would output an error that complained about an incorrect version of GNU Make, even if the
right one was installed.
- A bug that created inconsistent dependency files when a
- Fixed a typo that prevented the
NDK_MODULE_PATHenvironment variable from
working properly when
it contained multiple directories separated with a colon. - The
prebuilt-common.shscript contains fixes to check the compiler for 64-bit
generated machine code, instead of relying on the host tag, which
allows the 32-bit toolchain to rebuild properly on Snow Leopard. The toolchain rebuild scripts
now also support
using a 32-bit host toolchain. - A missing declaration for
INET_ADDRSTRLENwas added to
<netinet/in.h>. - Missing declarations for
IN6_IS_ADDR_MC_NODELOCALand
IN6_IS_ADDR_MC_GLOBALwere added to<netinet/in6.h>. - ‘asm’ was replaced with ‘__asm__’ in
<asm/byteorder.h>to allow
compilation with-std=c99.
the

This release of the NDK includes many new APIs, most of which are introduced to
support the development of games and similar applications that make extensive use
of native code. Using the APIs, developers have direct native access to events, audio,
graphics and window management, assets, and storage. Developers can also implement the
Android application lifecycle in native code with help from the new
NativeActivity class. For detailed information describing the changes
in this
release, read the CHANGES.HTML document included in the downloaded NDK
package.
- General notes:
-
- Adds support for native activities, which allows you to implement the
Android application lifecycle in native code. - Adds native support for the following:
- Input subsystem (such as the keyboard and touch screen)
- Access to sensor data (accelerometer, compass, gyroscope, etc).
- Event loop APIs to wait for things such as input and sensor events.
- Window and surface subsystem
- Audio APIs based on the OpenSL ES standard that support playback and recording
as well as control over platform audio effects - Access to assets packaged in an
.apkfile.
- Includes a new toolchain (based on GCC 4.4.3), which generates better code, and can
also now
be used as a standalone cross-compiler, for people who want to build their stuff with
./configure && make. See
docs/STANDALONE-TOOLCHAIN.html for the details. The binaries for GCC 4.4.0 are still
provided,
but the 4.2.1 binaries were removed. - Adds support for prebuilt static and shared libraries (docs/PREBUILTS.html) and
module
exports and imports to make sharing and reuse of third-party modules much easier
(docs/IMPORT-MODULE.html explains why). - Provides a default C++ STL implementation (based on STLport) as a helper module. It
can be used either
as a static or shared library (details and usage examples are in
sources/android/stlport/README). Prebuilt
binaries for STLport (static or shared) and GNU libstdc++ (static only) are also
provided if you choose to
compile against those libraries instead of the default C++ STL implementation.
C++ Exceptions and RTTI are not supported in the default STL implementation. For more
information, see
docs/CPLUSPLUS-SUPPORT.HTML. - Includes improvements to the
cpufeatureshelper library that improves
reporting
of the CPU type (some devices previously reported ARMv7 CPU when the device really was
an ARMv6). We
recommend developers that use this library to rebuild their applications then
upload to Google Play to benefit from the improvements. - Adds an EGL library that lets you create and manage OpenGL ES textures and
services. - Adds new sample applications,
native-plasmaand
native-activity,
to demonstrate how to write a native activity. - Includes many bugfixes and other small improvements; see docs/CHANGES.html for a
more
detailed list of changes.
- Adds support for native activities, which allows you to implement the

- NDK r4b notes:
-
Includes fixes for several issues in the NDK build and debugging scripts — if
you are using NDK r4, we recommend downloading the NDK r4b build. For detailed
information describing the changes in this release, read the CHANGES.TXT document
included in the downloaded NDK package.
- General notes:
-
- Provides a simplified build system through the new
ndk-buildbuild
command. - Adds support for easy native debugging of generated machine code on production
devices through the newndk-gdbcommand. - Adds a new Android-specific ABI for ARM-based CPU architectures,
armeabi-v7a. The new ABI extends the existingarmeabiABI to
include these CPU instruction set extensions:- Thumb-2 instructions
- VFP hardware FPU instructions (VFPv3-D16)
- Optional support for ARM Advanced SIMD (NEON) GCC intrinsics and VFPv3-D32.
Supported by devices such as Verizon Droid by Motorola, Google Nexus One, and
others.
- Adds a new
cpufeaturesstatic library (with sources) that lets your
app detect the host device’s CPU features at runtime. Specifically, applications can
check for ARMv7-A support, as well as VFPv3-D32 and NEON support, then provide separate
code paths as needed. - Adds a sample application,
hello-neon, that illustrates how to use the
cpufeatureslibrary to check CPU features and then provide an optimized
code path using NEON instrinsics, if supported by the CPU. - Lets you generate machine code for either or both of the instruction sets supported
by the NDK. For example, you can build for both ARMv5 and ARMv7-A architectures at the
same time and have everything stored to your application’s final
.apk. - To ensure that your applications are available to users only if their devices are
capable of running them, Google Play now filters applications based on the
instruction set information included in your application — no action is needed on
your part to enable the filtering. Additionally, the Android system itself also checks
your application at install time and allows the installation to continue only if the
application provides a library that is compiled for the device’s CPU architecture. - Adds support for Android 2.2, including a new stable API for accessing the pixel
buffers ofBitmapobjects from native code.
- Provides a simplified build system through the new

- General notes:
-
- Adds OpenGL ES 2.0 native library support.
- Adds a sample application,
hello-gl2, that illustrates the use of
OpenGL ES 2.0 vertex and fragment shaders. - The toolchain binaries have been refreshed for this release with GCC 4.4.0, which
should generate slightly more compact and efficient machine code than the previous one
(4.2.1). The NDK also still provides the 4.2.1 binaries, which you can optionally use
to build your machine code.

Originally released as «Android 1.6 NDK, Release 1».
- General notes:
-
- Adds OpenGL ES 1.1 native library support.
- Adds a sample application,
san-angeles, that renders 3D graphics
through the native OpenGL ES APIs, while managing activity lifecycle with aGLSurfaceViewobject.

Originally released as «Android 1.5 NDK, Release 1».
- General notes:
-
- Includes compiler support (GCC) for ARMv5TE instructions, including Thumb-1
instructions. - Includes system headers for stable native APIs, documentation, and sample
applications.
- Includes compiler support (GCC) for ARMv5TE instructions, including Thumb-1
System and Software Requirements
The sections below describe the system and software requirements for using the Android NDK, as
well as platform compatibility considerations that affect appplications using libraries produced
with the NDK.
The Android SDK
- A complete Android SDK installation (including all dependencies) is required.
- Android 1.5 SDK or later version is required.
Supported operating systems
- Windows XP (32-bit) or Vista (32- or 64-bit)
- Mac OS X 10.4.8 or later (x86 only)
- Linux (32 or 64-bit; Ubuntu 8.04, or other Linux distributions using GLibc 2.7 or
later)
Required development tools
- For all development platforms, GNU Make 3.81 or later is required. Earlier versions of GNU
Make might work but have not been tested. - A recent version of awk (either GNU Awk or Nawk) is also required.
- For Windows, Cygwin 1.7 or higher is required. The NDK
will not work with Cygwin 1.5 installations.
Android platform compatibility
- The native libraries created by the Android NDK can only be used on devices running
specific minimum Android platform versions. The minimum required platform version depends on
the CPU architecture of the devices you are targeting. The following table details which
Android platform versions are compatible with native code developed for specific CPU
architectures.Native Code CPU Architecture Used Compatible Android Platform(s) ARM, ARM-NEON Android 1.5 (API Level 3) and higher x86 Android 2.3 (API Level 9) and higher MIPS Android 2.3 (API Level 9) and higher These requirements mean you can use native libraries produced with the NDK in
applications that are deployable to ARM-based devices running Android 1.5 or later. If you are
deploying native libraries to x86 and MIPS-based devices, your application must target Android
2.3 or later. - To ensure compatibility, an application using a native library produced with the NDK
must declare aelement in its manifest file, with an
<uses-sdk>
android:minSdkVersionattribute value of «3» or higher. For example:<manifest> <uses-sdk android:minSdkVersion="3" /> ... </manifest>
- If you use this NDK to create a native library that uses the OpenGL ES APIs, the
application containing the library can be deployed only to devices running the minimum platform
versions described in the table below. To ensure compatibility, make sure that your application
declares the properandroid:minSdkVersionattribute value, as shown in the
following table. -
OpenGL ES Version Used Compatible Android Platform(s) Required uses-sdk Attribute OpenGL ES 1.1 Android 1.6 (API Level 4) and higher android:minSdkVersion="4"OpenGL ES 2.0 Android 2.0 (API Level 5) and higher android:minSdkVersion="5"For more information about API Level and its relationship to Android platform versions,
see Android API
Levels. - Additionally, an application using the OpenGL ES APIs should declare a
<uses-feature>element in its manifest, with an
android:glEsVersionattribute that specifies the minimum OpenGl ES version
required by the application. This ensures that Google Play will show your application only
to users whose devices are capable of supporting your application. For example:<manifest> <uses-feature android:glEsVersion="0x00020000" /> ... </manifest>
For more information, see the
<uses-feature>
documentation. - If you use this NDK to create a native library that uses the API to access Android
Bitmappixel buffers or utilizes native activities, the application
containing the library can be deployed only to devices running Android 2.2 (API levelor
higher. To ensure compatibility, make sure that your application declares<uses-sdkattribute value in its manifest.
android:minSdkVersion="8" />
Installing the NDK
Installing the NDK on your development computer is straightforward and involves extracting the
NDK from its download package.
Before you get started make sure that you have downloaded the latest Android SDK and upgraded your applications and environment as
needed. The NDK is compatible with older platform versions but not older versions of the SDK
tools.
Also, take a moment to review the System and
Software Requirements
for the NDK, if you haven’t already.
To install the NDK, first download the appropriate package from the table at the top of this
page. Then, follow the procedure for your development platform:
- On Linux and Mac OS X (Darwin):
- Download the appropriate package from this page.
- Open a terminal window.
- Go to the directory to which you downloaded the package.
- Run
chmod a+xon the downloaded package. - Execute the package. For example:
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin ndk$ ./android-ndk-r10c-darwin-x86_64.binThe folder containing the NDK extracts itself.
Note that you can also use a program like 7z to extract the package.
- On Windows:
- Download the appropriate package from this page.
- Navigate to the folder to which you downloaded the package.
- Double-click the downloaded file. The folder containing the NDK extracts itself.
When uncompressed, the NDK files are contained in a directory called
android-ndk-<version>. You can rename the NDK directory if necessary and you
can move it to any location on your computer. This documentation refers to the NDK directory as
<ndk>.
You are now ready to start working with the NDK.
Getting Started with the NDK
Once you’ve installed the NDK successfully, take a few minutes to read the documentation
included in the NDK. You can find the documentation in the <ndk>/docs/
directory. In particular, please read the OVERVIEW.HTML document completely, so that you
understand the intent of the NDK and how to use it.
If you used a previous version of the NDK, take a moment to review the list of NDK changes in
the CHANGES.HTML document.
Here’s the general outline of how you work with the NDK tools:
- Place your native sources under
<project>/jni/... - Create
<project>/jni/Android.mkto describe your native sources to the
NDK build system - Optional: Create
<project>/jni/Application.mk. - Build your native code by running the ‘ndk-build’ script from your project’s directory. It
is located in the top-level NDK directory:cd <project> <ndk>/ndk-build
The build tools copy the stripped, shared libraries needed by your application to the
proper location in the application’s project directory. - Finally, compile your application using the SDK tools in the usual way. The SDK build tools
will package the shared libraries in the application’s deployable.apkfile.
For complete information on all of the steps listed above, please see the documentation
included with the NDK package.
Using the NDK
The Android framework provides two ways to use native code:
- Write your application using the Android framework and use JNI to access the APIs provided
by the Android NDK. This technique allows you to take advantage of the convenience of the
Android framework, but still allows you to write native code when necessary. If you use this
approach, your application must target specific, minimum Android platform levels, see Android platform compatibility for more information. -
Write a native activity, which allows you to implement the lifecycle callbacks in native
code. The Android SDK provides theNativeActivityclass, which is a
convenience class that notifies your
native code of any activity lifecycle callbacks (onCreate(),
onPause(),
onResume(), etc). You can implement the callbacks in your native code to handle
these events when they occur. Applications that use native activities must be run on Android
2.3 (API Level 9) or later.You cannot access features such as Services and Content Providers natively, so if you want
to use them or any other framework API, you can still write JNI code to do so.
Contents of the NDK
The NDK contains the APIs, documentation, and sample
applications that help you write your native code. Specifically:
- A set of tools and build files used to generate native code libraries from C and C++
sources - A way to embed the corresponding native libraries into an application package file
(.apk) that can be deployed on Android devices - A set of native system headers and libraries that will be supported in all future versions
of the Android platform, starting from Android 1.5. Applications that use native activities
must be run on Android 2.3 or later. - Documentation, samples, and tutorials
The latest release of the NDK supports the following instruction sets:
- ARMv5TE, including Thumb-1 instructions (see
docs/CPU-ARCH-ABIS.htmlfor more
information) - ARMv7-A, including Thumb-2 and VFPv3-D16 instructions, with optional support for
NEON/VFPv3-D32 instructions (seedocs/CPU-ARM-NEON.htmlfor more information) - x86 instructions (see
docs/CPU-X86.htmlfor more information) - MIPS instructions (see
docs/CPU-MIPS.htmlfor more information)
ARMv5TE machine code will run on all ARM-based Android devices. ARMv7-A will run only on
devices such as the Verizon Droid or Google Nexus One that have a compatible CPU. The main
difference between the two instruction sets is that ARMv7-A supports hardware FPU, Thumb-2, and
NEON instructions. You can target either or both of the instruction sets — ARMv5TE is the
default, but switching to ARMv7-A is as easy as adding a single line to the application’s
Application.mk file, without needing to change anything else in the file. You can
also build for
both architectures at the same time and have everything stored in the final .apk.
Complete information is provided in the CPU-ARCH-ABIS.HTML in the NDK package.
The NDK provides stable headers for libc (the C library), libm (the Math library), OpenGL ES
(3D graphics library), the JNI interface, and other libraries, as listed in the Development tools section.
Development tools
The NDK includes a set of cross-toolchains (compilers, linkers, etc.) that can generate
native ARM binaries on Linux, OS X, and Windows (with Cygwin) platforms.
It provides a set of system headers for stable native APIs that are guaranteed to be supported
in all later releases of the platform:
- libc (C library) headers
- libm (math library) headers
- JNI interface headers
- libz (Zlib compression) headers
- liblog (Android logging) header
- OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
- libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
- A Minimal set of headers for C++ support
- OpenSL ES native audio libraries
- Android native application APIS
The NDK also provides a build system that lets you work efficiently with your sources, without
having to handle the toolchain/platform/CPU/ABI details. You create very short build files to
describe which sources to compile and which Android application will use them — the build
system compiles the sources and places the shared libraries directly in your application
project.
Important: With the exception of the libraries listed above,
native system libraries in the Android platform are not stable and may change in future
platform versions. Your applications should only make use of the stable native system
libraries provided in this NDK.
Documentation
The NDK package includes a set of documentation that describes the capabilities of the NDK and
how to use it to create shared libraries for your Android applications. In this release, the
documentation is provided only in the downloadable NDK package. You can find the documentation in
the <ndk>/docs/ directory. Included are these files (partial listing):
-
INSTALL.HTML — describes how to install the NDK and configure it for your host
system - OVERVIEW.HTML — provides an overview of the NDK capabilities and usage
- ANDROID-MK.HTML — describes the use of the Android.mk file, which defines the native
sources you want to compile - APPLICATION-MK.HTML — describes the use of the Application.mk file, which describes
the native sources required by your Android application - CPLUSPLUS-SUPPORT.HTML — describes the C++ support provided in the Android NDK
- CPU-ARCH-ABIS.HTML — a description of supported CPU architectures and how to target
them. - CPU-FEATURES.HTML — a description of the
cpufeaturesstatic library that
lets your application code detect the target device’s CPU family and the optional features at
runtime. - CHANGES.HTML — a complete list of changes to the NDK across all releases.
- DEVELOPMENT.HTML — describes how to modify the NDK and generate release packages for
it - HOWTO.HTML — information about common tasks associated with NDK development
- IMPORT-MODULE.HTML — describes how to share and reuse modules
- LICENSES.HTML — information about the various open source licenses that govern the
Android NDK - NATIVE-ACTIVITY.HTML — describes how to implement native activities
- NDK-BUILD.HTML — describes the usage of the ndk-build script
- NDK-GDB.HTML — describes how to use the native code debugger
- PREBUILTS.HTML — information about how shared and static prebuilt libraries work
- STANDALONE-TOOLCHAIN.HTML — describes how to use Android NDK toolchain as a standalone
compiler (still in beta). - SYSTEM-ISSUES.HTML — known issues in the Android system images that you should be
aware of, if you are developing using the NDK. - STABLE-APIS.HTML — a complete list of the stable APIs exposed by headers in the
NDK.
Additionally, the package includes detailed information about the «bionic» C library provided
with the Android platform that you should be aware of, if you are developing using the NDK. You
can find the documentation in the <ndk>/docs/system/libc/ directory:
- OVERVIEW.HTML — provides an overview of the «bionic» C library and the features it
offers.
Sample apps
The NDK includes sample applications that illustrate how to use native code in your Android
applications:
hello-jni— a simple application that loads a string from a native
method implemented in a shared library and then displays it in the application UI.two-libs— a simple application that loads a shared library dynamically
and calls a native method provided by the library. In this case, the method is implemented in a
static library imported by the shared library.san-angeles— a simple application that renders 3D graphics through the
native OpenGL ES APIs, while managing activity lifecycle with aGLSurfaceViewobject.hello-gl2— a simple application that renders a triangle using OpenGL ES
2.0 vertex and fragment shaders.hello-neon— a simple application that shows how to use the
cpufeatureslibrary to check CPU capabilities at runtime, then use NEON intrinsics
if supported by the CPU. Specifically, the application implements two versions of a tiny
benchmark for a FIR filter loop, a C version and a NEON-optimized version for devices that
support it.bitmap-plasma— a simple application that demonstrates how to access the
pixel buffers of AndroidBitmapobjects from native code, and uses
this to generate an old-school «plasma» effect.native-activity— a simple application that demonstrates how to use the
native-app-glue static library to create a native activitynative-plasma— a version of bitmap-plasma implemented with a native
activity.
For each sample, the NDK includes the corresponding C source code and the necessary Android.mk
and Application.mk files. There are located under <ndk>/samples/<name>/
and their source code can be found under <ndk>/samples/<name>/jni/.
You can build the shared libraries for the sample apps by going into
<ndk>/samples/<name>/ then calling the ndk-build command.
The generated shared libraries will be located under
<ndk>/samples/<name>/libs/armeabi/ for (ARMv5TE machine code) and/or
<ndk>/samples/<name>/libs/armeabi-v7a/ for (ARMv7 machine code).
Next, build the sample Android applications that use the shared libraries:
- If you are developing in Eclipse with ADT, use the New Project Wizard to create a new
Android project for each sample, using the «Import from Existing Source» option and importing
the source from<ndk>/samples/<name>/. Then, set up an AVD,
if necessary, and build/run the application in the emulator. - If you are developing with Ant, use the
androidtool to create the build file
for each of the sample projects at<ndk>/samples/<name>/.
Then set up an AVD, if necessary, build your project in the usual way, and run it in the
emulator.
For more information about developing with the Android SDK tools and what
you need to do to create, build, and run your applications, see
the Overview
section for developing on Android.
Exploring the hello-jni Sample
The hello-jni sample is a simple demonstration on how to use JNI from an Android application.
The HelloJni activity receives a string from a simple C function and displays it in a
TextView.
The main components of the sample include:
- The familiar basic structure of an Android application (an
AndroidManifest.xml
file, asrc/andresdirectories, and a main activity) - A
jni/directory that includes the implemented source file for the native code
as well as the Android.mk file - A
tests/directory that contains unit test code.
- Create a new project in Eclipse from the existing sample source or use the
androidtool to update the project so it generates a build.xml file that you can
use to build the sample.- In Eclipse:
- Click File > New Android Project…
- Select the Create project from existing source radio button.
- Select any API level above Android 1.5.
- In the Location field, click Browse… and select
the<ndk-root>/samples/hello-jnidirectory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/hello-jnidirectory. - Run the following command to generate a build.xml file:
android update project -p . -s
- Change to the
- In Eclipse:
- Compile the native code using the
ndk-buildcommand.cd <ndk-root>/samples/hello-jni <ndk_root>/ndk-build
- Build and install the application as you would a normal Android application. If you are
using Eclipse, run the application to build and install it on a device. If you are using Ant,
run the following commands from the project directory:ant debug adb install bin/HelloJni-debug.apk
When you run the application on the device, the string Hello JNI should appear on
your device. You can explore the rest of the samples that are located in the
<ndk-root>/samples directory for more examples on how to use the JNI.
Exploring the native-activity Sample Application
The native-activity sample provided with the Android NDK demonstrates how to use the
android_native_app_glue static library. This static library makes creating a native activity
easier by providing you with an implementation that handles your callbacks in another thread, so
you do not have to worry about them blocking your main UI thread. The main parts of the sample
are described below:
- The familiar basic structure of an Android application (an
AndroidManifest.xml
file, asrc/andresdirectories). The AndroidManifest.xml declares
that the application is native and specifies the .so file of the native activity. SeeNativeActivityfor the source or see the
<ndk_root>/platforms/samples/native-activity/AndroidManifest.xmlfile. - A
jni/directory contains the native activity, main.c, which uses the
android_native_app_glue.hinterface to implement the activity. The Android.mk that
describes the native module to the build system also exists here.
To build this sample application:
- Create a new project in Eclipse from the existing sample source or use the
androidtool to update the project so it generates a build.xml file that you can
use to build the sample.- In Eclipse:
- Click File > New Android Project…
- Select the Create project from existing source radio button.
- Select any API level above Android 2.3.
- In the Location field, click Browse… and select
the<ndk-root>/samples/native-activitydirectory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/native-activitydirectory. - Run the following command to generate a build.xml file:
android update project -p . -s
- Change to the
- In Eclipse:
- Compile the native code using the
ndk-buildcommand.cd <ndk-root>/platforms/samples/android-9/samples/native-activity <ndk_root>/ndk-build
- Build and install the application as you would a normal Android application. If you are
using Eclipse, run the application to build and install it on a device. If you are using Ant,
run the following commands in the project directory, then run the application on the device:ant debug adb install bin/NativeActivity-debug.apk
Each software is released under license type that can be found on program pages as well as on search or category pages. Here are the most common license types:
Freeware
Freeware programs can be downloaded used free of charge and without any time limitations. Freeware products can be used free of charge for both personal and professional (commercial use).
Open Source
Open Source software is software with source code that anyone can inspect, modify or enhance. Programs released under this license can be used at no cost for both personal and commercial purposes. There are many different open source licenses but they all must comply with the Open Source Definition — in brief: the software can be freely used, modified and shared.
Free to Play
This license is commonly used for video games and it allows users to download and play the game for free. Basically, a product is offered Free to Play (Freemium) and the user can decide if he wants to pay the money (Premium) for additional features, services, virtual or physical goods that expand the functionality of the game. In some cases, ads may be show to the users.
Demo
Demo programs have a limited functionality for free, but charge for an advanced set of features or for the removal of advertisements from the program’s interfaces. In some cases, all the functionality is disabled until the license is purchased. Demos are usually not time-limited (like Trial software) but the functionality is limited.
Trial
Trial software allows the user to evaluate the software for a limited amount of time. After that trial period (usually 15 to 90 days) the user can decide whether to buy the software or not. Even though, most trial software products are only time-limited some also have feature limitations.
Paid
Usually commercial software or games are produced for sale or to serve a commercial purpose.
Tool for Android and Java programmers»
Most of the modern and current smartphones are built on Android phone technology. That means that if you want to have a tool uploaded on this technology then you must use compatible tools to develop and create the apps. This is one such application that comes in handy to make sure you are able to use various programming languages to develop the app. This is a tool that codes the text details using the command line prompt to handle this tool. In fact, without this, you will not even start the process of handling the tool.
This SDK is helpful for Android developers. Although you can also get scripts for both Java and C programming language. The synchronization settings of this tool are such that you can deal with both the Android and other phone technology. The fact that you use native codes in designing the projects then you are sure that you can handle both the single and multiple scripts. In short, you can say that this is a native development toolkit or an Android development kit and also a toolchain.
Android NDK is licensed as freeware for PC or laptop with Windows 32 bit and 64 bit operating system. It is in sdk category and is available to all software users as a free download.
| Share |
| Give a rating |
|
|
| Author |
|
Google
|
| Last Updated On |
| January 10, 2019 |
| Runs on |
| Windows 10 / Windows 8 / Windows 7 / Windows Vista / XP |
| Total downloads |
| 1,728 |
| License |
|
Free |
| File size |
| 498,28 MB |
| Filename |
|
android-ndk-r18b-windows-x86.zip android-ndk-r18b-windows-x86_64.zip |
The Android NDK is a companion tool to the Android SDK that lets you build performance-critical portions of your apps in native code. It provides headers and libraries that allow you to build activities, handle user input, use hardware sensors, access application resources, and more, when programming in C or C++. If you write native code, your applications are still packaged into an .apk file and they still run inside of a virtual machine on the device. The fundamental Android application model does not change.
Why use Android NDK ?
Using native code does not result in an automatic performance increase, but always increases application complexity. If you have not run into any limitations using the Android framework APIs, you probably do not need the NDK.
The NDK will not benefit most applications. As a developer, you need to balance its benefits against its drawbacks; notably, using native code does not result in an automatic performance increase, but always increases application complexity. In general, you should only use native code if it is essential to your application, not just because you prefer to program in C/C++.
Typical good candidates for the NDK are self-contained, CPU-intensive operations that don’t allocate much memory, such as signal processing, physics simulation, and so on. Simply re-coding a method to run in C usually does not result in a large performance increase. When examining whether or not you should develop in native code, think about your requirements and see if the Android framework APIs provide the functionality that you need. The NDK can, however, can be an effective way to reuse a large corpus of existing C/C++ code.
The Android framework provides two ways to use native code:
- Write your application using the Android framework and use JNI to access the APIs provided by the Android NDK. This technique allows you to take advantage of the convenience of the Android framework, but still allows you to write native code when necessary. You can install applications that use native code through the JNI on devices that run Android 1.5 or later.
- Write a native activity, which allows you to implement the lifecycle callbacks in native code. The Android SDK provides the NativeActivity class, which is a convenience class that notifies your native code of any activity lifecycle callbacks (onCreate(), onPause(), onResume(), etc). You can implement the callbacks in your native code to handle these events when they occur. Applications that use native activities must be run on Android 2.3 (API Level 9) or later.
You cannot access features such as Services and Content Providers natively, so if you want to use them or any other framework API, you can still write JNI code to do so.
System Requirements for Android NDK Installation
The NDK is designed for use only in conjunction with the Android SDK. If you have not already installed and setup the Android SDK, please do so before downloading the NDK.
The Android SDK
- A complete Android SDK installation (including all dependencies) is required.
- Android 1.5 SDK or later version is required.
Supported operating systems for Android NDk
- Windows XP (32-bit) or Vista (32- or 64-bit)
- Mac OS X 10.4.8 or later (x86 only)
- Linux (32 or 64-bit; Ubuntu 8.04, or other Linux distributions using GLibc 2.7 or later)
Required development tools for Android NDK
- For all development platforms, GNU Make 3.81 or later is required. Earlier versions of GNU Make might work but have not been tested.
- A recent version of awk (either GNU Awk or Nawk) is also required.
- For Windows, Cygwin 1.7 or higher is required. The NDK will not work with Cygwin 1.5 installations.
The NDK provides:
- A set of tools and build files used to generate native code libraries from C and C++ sources
- A way to embed the corresponding native libraries into an application package file (.apk) that can be deployed on Android devices.
- A set of native system headers and libraries that will be supported in all future versions of the Android platform, starting from Android 1.5. Applications that use native activities must be run on Android 2.3 or later.
- Documentation, samples, and tutorial
The latest release of the NDK supports the following instruction sets:
- ARMv5TE (including Thumb-1 instructions)
- ARMv7-A (including Thumb-2 and VFPv3-D16 instructions, with optional support for NEON/VFPv3-D32 instructions)
- x86 instructions (see CPU-ARCH-ABIS.HTML for more information)
ARMv5TE machine code will run on all ARM-based Android devices.
ARMv7-A will run only on devices such as the Verizon Droid or Google Nexus One that have a compatible CPU.
The main difference between the two instruction sets is that ARMv7-A supports hardware FPU, Thumb-2, and NEON instructions. You can target either or both of the instruction sets — ARMv5TE is the default, but switching to ARMv7-A is as easy as adding a single line to the application’s Application.mk file, without needing to change anything else in the file. You can also build for both architectures at the same time and have everything stored in the final .apk. Complete information is provided in the CPU-ARCH-ABIS.HTML in the NDK package.
The NDK provides stable headers for libc (the C library), libm (the Math library), OpenGL ES (3D graphics library), the JNI interface, and other libraries, as listed in the Development Tools section.
The NDK includes a set of cross-toolchains (compilers, linkers, etc..) that can generate native ARM binaries on Linux, OS X, and Windows (with Cygwin) platforms.
It provides a set of system headers for stable native APIs that are guaranteed to be supported in all later releases of the platform:
- libc (C library) headers
- libm (math library) headers
- JNI interface headers
- libz (Zlib compression) headers
- liblog (Android logging) header
- OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
- libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
- A Minimal set of headers for C++ support
- OpenSL ES native audio libraries
- Android native application APIS
The NDK also provides a build system that lets you work efficiently with your sources, without having to handle the toolchain/platform/CPU/ABI details. You create very short build files to describe which sources to compile and which Android application will use them — the build system compiles the sources and places the shared libraries directly in your application project.
NOTE: With the exception of the libraries listed above, native system libraries in the Android platform are not stable and may change in future platform versions. Your applications should only make use of the stable native system libraries provided in this NDK.
Sample applications code and documentation is also included in package.
Android NDK Old Versions
Following are the Android NDK releases to date starting from June 2009
Android NDK, Revision 7 (November 2011)
Android NDK, Revision 6b (August 2011)
Android NDK, Revision 6 (July 2011)
Android NDK, Revision 5c (June 2011)
Android NDK, Revision 5b (January 2011)
Android NDK, Revision 5 (December 2010)
Android NDK, Revision 4b (June 2010)
Android NDK, Revision 3 (March 2010)
Android NDK, Revision 2 (September 2009)
Android NDK, Revision 1 (June 2009)
-
Home
-
Products
-
Google VR
-
Develop
Stay organized with collections
Save and categorize content based on your preferences.
Click the button below to agree to the above terms and conditions and access the
Google VR SDK.
Agree
All rights reserved. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2020-10-28 UTC.
10.3 Rio’s installer (I use and recommend the EXE/web over the ISO, since it is faster and more flexible) does a fantastic job of installing and setting everything up for Android development, without requiring any manual steps. Still, sometimes it is nice to be able to manually install everything, which brings me to this guide.
I’m a big believer in understanding the way the underlying systems work, and installing this way is more work, but you are able to see how everything works together. Also, this allows you to share SDKs between multiple installations, and also place the tools like ADB on your path for easy use. Not to say you can’t do all of that with the automatic install, but sometimes it is nice to get your hands dirty.
I also occasionally run into people who are having trouble getting things installed for various reasons. So this is a great way to troubleshoot installation issues.
This assumes you already have RAD Studio, Delphi, or C++Builder 10.3 Rio already installed. 10.3 Rio changed the versions of the SDK and NDK that it uses, so this guide won’t work with other versions. Also, I switched to AdoptOpenJDK instead of the traditional Oracle JDK. I’ll show you how to install that here, but if you use a different JDK that will be different for you.
OpenJDK is a free and open-source implementation of the Java Platform, Standard Edition. It is the result of an effort Sun Microsystems began in 2006. The implementation is licensed under the GNU General Public License version 2 with a linking exception. It is the official reference implementation of Java SE since version 7.
There are multiple builds available, with different terms and support options. Why not just use the Java SE JDK? Oracle has changed the license on it that may require you to purchase a license to use it. For my purposes it is better save than sorry, plus the OpenJDK is a lot smaller and less annoying. I picked AdoptOpenJDK, which seems to be the most popular option, but this should mostly work the same with any build.
AdoptOpenJDK includes the JRE (Java Runtime Environment) too, so just one install. You must install it first because you can’t run the Android SDK manager without Java installed, and the IDE users the JDK for KeyTool and JarSigner.
AdoptOpenJDK Install Instructions
Download the Windows installer for OpenJDK 8 (LTS). I used the 64-bit Windows version with the HotSpot JVM, and then just run the installation. Be sure to tell it to set the JAVA_HOME environment variable.
- OpenJDK8U-jdk_x64_windows_hotspot_8u212b04.msi
- Windows 64-bit OpenJDK 8 (LTS) with HotSpot JVM
- 90.2 MB (94,650,368 bytes)
- SHA256 22303C8338C8015BA34B21829706C1231DD966BD84372CE0DE944C848BB13C52

When you visit the site to download the Android SDK they try to get you to download the full Android Studio, but you don’t need all of that. If you scroll to the bottom, you will see the “Command line tools only” downloads. One note, the downloads listed on the site no longer include the GUI SDK Manager. If you scroll down further, I’ll show you how you can download that and use it instead.
Command-Line Only install
- sdk-tools-windows-4333796.zip
- Windows Platform SDK
- 148 MB (156,136,858 bytes)
- SHA256 7e81d69c303e47a4f0e748a6352d85cd0c8fd90a5a95ae4e076b5e5f960d3c7a
This isn’t an installer, so just pick a folder to unzip it into. You will just find a “tools” folder in the zip. This contains the SDK Manager to install the rest of the Android SDK. I typically unzip it into the folder:
C:UsersPublicDocumentsEmbarcaderoStudioAndroidSDK
Then use the sdkmanager command-line tool (in the toolsbin folder) to install everything you need. Notice I am installing the Android 26 Platform. This is the version you want to use with 10.3 Rio. It meets the new Target SDK requirements and still gives your Android apps maximum compatibility. This is the version 10.3 Rio is designed to work with.
sdkmanager "build-tools;29.0.0" "extras;google;usb_driver" "platforms;android-26" "tools" "platform-tools"
Android SDK with GUI Install
For some reason the Android SDK GUI Installer isn’t listed for download, but the file is still available on their servers.
- https://dl.google.com/android/repository/tools_r25.2.5-windows.zip
- Android SDK release 25.2.5 (this is the version RAD Studio installs, and the last version with the GUI)
- 292 MB (306,785,944 bytes)
- SHA256 DA1A0BD9BB358CB52A8FC0A553A060428EFE11151E69B9EA7A5CBACB27CF1C7C
The fact we are installing an older version of the SDK isn’t a big deal because we will still update it when we are done, but now we have a choice of using the command-line interface like I showed in the previous section, or using the GUI SDK Manager by running the Android.bat file in the tools folder.
Once you run the SDK manager, you want to install the latest Android SDK Tools, Android SDK Platform-tools, Android SDK Build-tools, Android API 26 SDK Platform, and the Google USB Driver. It will default to installing a lot of other things you don’t need. Feel free to deselect those. The Google USB Driver isn’t technically needed, but is nice to have.
Once you’ve selected what you want installed, you can always update them via the command line with the sdkmanager utility in the toolsbin folder
sdkmanager --update

Installing the Android NDK
10.3 Rio updated the version of the Android NDK it uses to release 17b. It was the latest at the time of Rio’s development. There have been some new NDK releases since then. If you visit the Older Releases page for the Android NDK you will see 17b isn’t listed there, but the download file is still available. 17c may work, but I haven’t tested it extensively yet.
- android-ndk-r17b-windows-x86.zip
- Windows 32-bit version 17b
- 580 MB (608,351,759 bytes)
- SHA256 4F6128AE1D6382A783EF6C8B836E8DA94B81AA490DC83DDCD2788BFE27E40A53
The NDK is also a zip file, so just extract it to the folder of your choosing. I’ll extract it next to my Android SDK. The root folder in the zip file is “android-ndk-r17b”
C:UsersPublicDocumentsEmbarcaderoStudioandroid-ndk-r17b
There are no further installation steps necessary. Your folders should look something like this when you are done:
I’ve expanded the directories so you can see the build tools and Android platforms also installed
Environment Variables and System Path
Last thing you need to do is set up some Environment Variables and add things to your system path. This isn’t strictly necessary, but I highly recommend it!
Then add the following to your system path
- %JAVA_HOME%bin (you can replace the expanded version with this)
- %JAVA_HOME%jrebin
- %ANDROID_HOME%tools
- %ANDROID_HOME%toolsbin
- %ANDROID_HOME%platform-tools
Using the environment variables in the path saves environment space.
Settings Up the IDE SDK Manager
Since we’ve installed the SDK manually, we need to tell the IDE where to find it. This is really simple. Go into Tools ? Options ? Deployment ? SDK Manager (or just use the IDE search for SDK Manager) and add a new SDK entry.
The next stage in the wizard looks to make sure it can find everything it needs. If you didn’t install everything with the Android SDK Manager, then you may see a warning symbol next to something. If that is the case go back and double check the installation.
The SDK Manager found everything it needs to continue.
And with that you are ready to develop and deploy Android apps with FireMonkey.
| Platform | Package | Size | MD5 Checksum |
|---|---|---|---|
| Windows | android-ndk-r8-windows.zip | 109928336 bytes | 37b1a2576f28752fcc09e1b9c07e3f14 |
| Mac OS X (intel) | android-ndk-r8-darwin-x86.tar.bz2 | 96650992 bytes | 81ce5de731f945692123b377afe0bad9 |
| Linux 32/64-bit (x86) | android-ndk-r8-linux-x86.tar.bz2 | 88310791 bytes | 5c9afc9695ad67c61f82fbf896803c05 |
In this document
- Downloads
- Revisions
- System and Software Requirements
- Installing the NDK
- Getting Started with the NDK
- Using the NDK
- Contents of the NDK
- Development tools
- Documentation
- Sample apps
The NDK is a toolset that allows you to implement parts
of your app using native-code languages such as C and C++. For certain types of apps,
this can be helpful so that you may reuse existing code libraries written in these
languages and possibly increased performance.
Before downloading the NDK, you should understand that the NDK
will not benefit most apps. As a developer, you need to balance its benefits
against its drawbacks. Notably, using native code on Android
generally does not result in a noticable performance improvement,
but it always increases your app complexity. In general, you should only use the NDK
if it is essential to your app—never because you simply prefer to program in C/C++.
Typical good candidates for the NDK are self-contained, CPU-intensive operations that don’t
allocate much memory, such as signal processing, physics simulation, and so on. When examining
whether or not you should develop in native code, think about your requirements and see if the
Android framework APIs provide the functionality that you need.
Downloads
Revisions
The sections below provide information and notes about successive releases of
the NDK, as denoted by revision number.
Android NDK, Revision 8 (May 2012)
This release of the NDK includes support for MIPS ABI and a few additional fixes.
- Added support for the MIPS ABI, which allows you to generate machine code that runs on
compatible MIPS-based Android devices. Major features for MIPS include MIPS-specific
toolchains, system headers, libraries and debugging support. For more details regarding
MIPS support, seedocs/CPU-MIPS.htmlin the NDK package.By default, code is generated for ARM-based devices. You can add
mipsto
yourAPP_ABIdefinition in yourApplication.mkfile to build
for MIPS platforms. For example, the following line instructsndk-build
to build your code for three distinct ABIs:APP_ABI := armeabi armeabi-v7a mips
Unless you rely on architecture-specific assembly sources, such as ARM assembly
code, you should not need to touch yourAndroid.mkfiles to build MIPS
machine code. - You can build a standalone MIPS toolchain using the
--arch=mips
option when callingmake-standalone-toolchain.sh. See
docs/STANDALONE-TOOLCHAIN.htmlfor more details.
Note: To ensure that your applications are available
to users only if their devices are capable of running them, Google Play filters applications based
on the instruction set information included in your application ? no action is needed on your part
to enable the filtering. Additionally, the Android system itself also checks your application at
install time and allows the installation to continue only if the application provides a library that
is compiled for the device’s CPU architecture.
- Fixed a typo in GAbi++ implementation where the result of
dynamic_cast<D>(b)of base class objectbto derived classDis
incorrectly adjusted in the opposite direction from the base class.
(Issue 28721) - Fixed an issue in which
make-standalone-toolchain.shfails to copy
libsupc++.*.
- Fixed
ndk-build.cmdto ensure thatndk-build.cmdworks correctly even
if the user has redefined theSHELLenvironment variable, which may be changed
when installing a variety of development tools in Windows environments.
Android NDK, Revision 7c (April 2012)
This release of the NDK includes an important fix for Tegra2-based devices, and a few
additional fixes and improvements:
- Important bug fixes:
-
- Fixed GNU STL armeabi-v7a binaries to not crash on non-NEON
devices. The files provided with NDK r7b were not configured properly,
resulting in crashes on Tegra2-based devices and others when trying to use
certain floating-point functions (e.g.,cosf,sinf,expf).
- Fixed GNU STL armeabi-v7a binaries to not crash on non-NEON
- Important changes:
-
- Added support for custom output directories through the
NDK_OUT
environment variable. When defined, this variable is used to store all
intermediate generated files, instead of$PROJECT_PATH/obj. The variable is
also recognized byndk-gdb. - Added support for building modules with hundreds or even thousands of source
files by definingLOCAL_SHORT_COMMANDStotruein yourAndroid.mk.This change forces the NDK build system to put most linker or archiver options
into list files, as a work-around for command-line length limitations.
Seedocs/ANDROID-MK.htmlfor details.
- Added support for custom output directories through the
- Other bug fixes:
-
- Fixed
android_getCpuCount()implementation in thecpufeatures
helper library. On certain devices, where cores are enabled dynamically by the system, the previous
implementation would report the total number of active cores the first time the function
was called, rather than the total number of physically available cores.
- Fixed
Android NDK, Revision 7b (February 2012)
This release of the NDK includes fixes for native Windows builds, Cygwin and many other
improvements:
- Important bug fixes:
-
- Updated
sys/atomics.hto avoid correctness issues
on some multi-core ARM-based devices. Rebuild your unmodified sources with this
version of the NDK and this problem should be completely eliminated.
For more details, readdocs/ANDROID-ATOMICS.html. - Reverted to
binutils2.19 to fix debugging issues that
appeared in NDK r7 (which switched tobinutils2.20.1). - Fixed
ndk-buildon 32-bit Linux. A packaging error put a 64-bit version
of theawkexecutable underprebuilt/linux-x86/binin NDK r7. - Fixed native Windows build (
ndk-build.cmd). Other build modes were not
affected. The fixes include:- Removed an infinite loop / stack overflow bug that happened when trying
to callndk-build.cmdfrom a directory that was not the top of
your project path (e.g., in any sub-directory of it). - Fixed a problem where the auto-generated dependency files were ignored. This
meant that updating a header didn’t trigger recompilation of sources that included
it. - Fixed a problem where special characters in files or paths, other than spaces and
quotes, were not correctly handled.
- Removed an infinite loop / stack overflow bug that happened when trying
- Fixed the standalone toolchain to generate proper binaries when using
-lstdc++(i.e., linking against the GNUlibstdc++C++ runtime). You
should use-lgnustl_sharedif you want to link against the shared library
version or-lstdc++for the static version.See
docs/STANDALONE-TOOLCHAIN.htmlfor more details about this fix. - Fixed
gnustl_sharedon Cygwin. The linker complained that it couldn’t find
libsupc++.aeven though the file was at the right location. - Fixed Cygwin C++ link when not using any specific C++ runtime through
APP_STL.
- Updated
- Other changes:
-
- When your application uses the GNU
libstdc++runtime, the compiler will
no longer forcibly enable exceptions and RTTI. This change results in smaller code.If you need these features, you must do one of the following:
- Enable exceptions and/or RTTI explicitly in your modules or
Application.mk. (recommended) - Define
APP_GNUSTL_FORCE_CPP_FEATURESto'exceptions',
'rtti'or both in yourApplication.mk. See
docs/APPLICATION-MK.htmlfor more details.
- Enable exceptions and/or RTTI explicitly in your modules or
ndk-gdbnow works properly when your application has private services
running in independent processes. It debugs the main application process, instead of the
first process listed byps, which is usually a service process.- Fixed a rare bug where NDK r7 would fail to honor the
LOCAL_ARM_MODEvalue
and always compile certain source files (but not all) to 32-bit instructions. stlport: Refresh the sources to match the Android platform version. This
update fixes a few minor bugs:- Fixed instantiation of an incomplete type
- Fixed minor «==» versus «=» typo
- Used
memmoveinstead ofmemcpyinstring::assign - Added better handling of
IsNANorINF,IsINF,IsNegNAN,
etc.
For complete details, see the commit log.
stlport: Removed 5 unnecessary static initializers from the library.- The GNU libstdc++ libraries for armeabi-v7a were mistakenly compiled for
armeabi instead. This change had no impact on correctness, but using the right
ABI should provide slightly better performance. - The
cpu-featureshelper library was updated to report three optional
x86 CPU features (SSSE3,MOVBEandPOPCNT). See
docs/CPU-FEATURES.htmlfor more details. docs/NDK-BUILD.htmlwas updated to mentionNDK_APPLICATION_MKinstead
ofNDK_APP_APPLICATION_MKto select a customApplication.mkfile.- Cygwin:
ndk-buildno longer creates an empty «NUL» file in the current
directory when invoked. - Cygwin: Added better automatic dependency detection. In the previous version, it
didn’t work properly in the following cases:- When the Cygwin drive prefix was not
/cygdrive. - When using drive-less mounts, for example, when Cygwin would translate
/hometo\serversubdirinstead ofC:SomeDir.
- When the Cygwin drive prefix was not
- Cygwin:
ndk-builddoes not try to use the native Windows tools under
$NDK/prebuilt/windows/binwith certain versions of Cygwin and/or GNU Make.
- When your application uses the GNU
Android NDK, Revision 7 (November 2011)
This release of the NDK includes new features to support the Android 4.0 platform as well
as many other additions and improvements:
- New features
-
- Added official NDK APIs for Android 4.0 (API level 14), which adds the following
native features to the platform:- Added native multimedia API based on the Khronos Group OpenMAX AL? 1.0.1
standard. The new<OMXAL/OpenMAXAL.h>and
<OMXAL/OpenMAXAL_Android.h>headers allow applications targeting
API level 14 to perform multimedia output directly from native code by using a new
Android-specific buffer queue interface. For more details, see
docs/openmaxal/index.htmland http://www.khronos.org/openmax/. - Updated the native audio API based on the Khronos Group OpenSL ES 1.0.1?
standard. With API Level 14, you can now decode compressed audio (e.g. MP3, AAC,
Vorbis) to PCM. For more details, seedocs/opensles/index.htmland
http://www.khronos.org/opensles/.
- Added native multimedia API based on the Khronos Group OpenMAX AL? 1.0.1
- Added CCache support. To speed up large rebuilds, define the
NDK_CCACHEenvironment variable toccache(or the path to
yourccachebinary). When declared, the NDK build system automatically
uses CCache when compiling any source file. For example:export NDK_CCACHE=ccache
Note: CCache is not included in the NDK release
so you must have it installed prior to using it. For more information about CCache, see
http://ccache.samba.org. - Added support for setting
APP_ABItoallto indicate that
you want to build your NDK modules for all the ABIs supported by your given NDK
release. This means that either one of the following two lines in your
Application.mkare equivalent with this release:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
This also works if you define
APP_ABIwhen calling
ndk-buildfrom the command-line, which is a quick way to check that your
project builds for all supported ABIs without changing the project’s
Application.mk file. For example:ndk-build APP_ABI=all
- Added a
LOCAL_CPP_FEATURESvariable inAndroid.mkthat
allows you to declare which C++ features (RTTI or Exceptions) your module uses. This
ensures that the final linking works correctly if you have prebuilt modules that depend
on these features. Seedocs/ANDROID-MK.htmland
docs/CPLUSPLUS-SUPPORT.htmlfor more details. - Shortened paths to source and object files that are used in build commands. When
invoking$NDK/ndk-buildfrom your project path, the paths to the source,
object, and binary files that are passed to the build commands are significantly
shorter now, because they are passed relative to the current directory. This is useful
when building projects with a lot of source files, to avoid limits on the maximum
command line length supported by your host operating system. The behavior is unchanged
if you invokendk-buildfrom a sub-directory of your project tree, or if
you defineNDK_PROJECT_PATHto point to a specific directory.
- Added official NDK APIs for Android 4.0 (API level 14), which adds the following
- Experimental features
-
You can now build your NDK source files on Windows without Cygwin by calling the
ndk-build.cmdscript from the command line from your project path. The
script takes exactly the same arguments as the originalndk-buildscript.
The Windows NDK package comes with its own prebuilt binaries for GNU Make, Awk and other
tools required by the build. You should not need to install anything else to get a
working build system.Important:
ndk-gdbdoes not work on
Windows, so you still need Cygwin to debug.This feature is still experimental, so feel free to try it and report issues on the
public bug database or public forum. All samples and unit tests
shipped with the NDK succesfully compile with this feature. - Important bug fixes
-
- Imported shared libraries are now installed by default to the target installation
location (libs/<abi>) ifAPP_MODULESis not defined in
yourApplication.mk. For example, if a top-level modulefoo
imports a modulebar, then bothlibfoo.soand
libbar.soare copied to the install location. Previously, only
libfoo.sowas copied, unless you listedbarin your
APP_MODULEStoo. If you defineAPP_MODULESexplicitly, the
behavior is unchanged. ndk-gdbnow works correctly for activities with multiple categories in
their MAIN intent filters.- Static library imports are now properly transitive. For example, if a top-level
modulefooimports static librarybarthat imports static
libraryzoo, thelibfoo.sowill now be linked against both
libbar.aandlibzoo.a.
- Imported shared libraries are now installed by default to the target installation
- Other changes
-
docs/NATIVE-ACTIVITY.HTML: Fixed typo. The minimum API level should be
9, not 8 for native activities.docs/STABLE-APIS.html: Added missing documentation listing EGL as a
supported stable API, starting from API level 9.download-toolchain-sources.sh: Updated to download the toolchain
sources from android.googlesource.com,
which is the new location for the AOSP servers.- Added a new C++ support runtime named
gabi++. More details about it
are available in the updateddocs/CPLUSPLUS-SUPPORT.html. - Added a new C++ support runtime named
gnustl_sharedthat corresponds
to the shared library version of GNU libstdc++ v3 (GPLv3 license). See more info at
docs/CPLUSPLUS-SUPPORT.html - Added support for RTTI in the STLport C++ runtimes (no support for
exceptions). - Added support for multiple file extensions in
LOCAL_CPP_EXTENSION. For
example, to compile bothfoo.cppandbar.cxxas C++ sources,
declare the following:LOCAL_CPP_EXTENSION := .cpp .cxx
- Removed many unwanted exported symbols from the link-time shared system libraries
provided by the NDK. This ensures that code generated with the standalone toolchain
doesn’t risk to accidentally depend on a non-stable ABI symbol (e.g. any libgcc.a
symbol that changes each time the toolchain used to build the platform is changed) - Refreshed the EGL and OpenGLES Khronos headers to support more extensions. Note
that this does not change the NDK ABIs for the corresponding libraries,
because each extension must be probed at runtime by the client application.The extensions that are available depend on your actual device and GPU drivers,
not the platform version the device runs on. The header changes simply add new
constants and types to make it easier to use the extensions when they have been
probed witheglGetProcAddress()orglGetProcAddress(). The
following list describes the newly supported extensions:- GLES 1.x
-
GL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_APPLE_texture_2D_limited_npotGL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_filter_anisotropicGL_EXT_texture_format_BGRA8888GL_EXT_texture_lod_biasGL_IMG_read_formatGL_IMG_texture_compression_pvrtcGL_IMG_texture_env_enhanced_fixed_functionGL_IMG_user_clip_planeGL_IMG_multisampled_render_to_textureGL_NV_fenceGL_QCOM_driver_controlGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_perfmon_global_modeGL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uintGL_OES_get_program_binaryGL_OES_mapbufferGL_OES_packed_depth_stencilGL_OES_texture_3DGL_OES_texture_floatGL_OES_texture_float_linearGL_OES_texture_half_float_linearGL_OES_texture_npotGL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_AMD_program_binary_Z400GL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_format_BGRA8888GL_EXT_texture_compression_dxt1GL_IMG_program_binaryGL_IMG_read_formatGL_IMG_shader_binaryGL_IMG_texture_compression_pvrtcGL_IMG_multisampled_render_to_textureGL_NV_coverage_sampleGL_NV_depth_nonlinearGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordableEGL_NV_system_time
Android NDK, Revision 6b (August 2011)
This release of the NDK does not include any new features compared to r6. The r6b release
addresses the following issues in the r6 release:
- Important bug fixes
-
- Fixed the build when
APP_ABI="armeabi x86"is used for
multi-architecture builds. - Fixed the location of prebuilt STLport binaries in the NDK release package.
A bug in the packaging script placed them in the wrong location. - Fixed
atexit()usage in shared libraries with the x86standalone
toolchain. - Fixed
make-standalone-toolchain.sh --arch=x86. It used to fail
to copy the proper GNU libstdc++ binaries to the right location. - Fixed the standalone toolchain linker warnings about missing the definition and
size for the__dso_handlesymbol (ARM only). - Fixed the inclusion order of
$(SYSROOT)/usr/includefor x86 builds.
See the bug for
more information. - Fixed the definitions of
ptrdiff_tandsize_tin
x86-specific systems when they are used with the x86 standalone toolchain.
- Fixed the build when
Android NDK, Revision 6 (July 2011)
This release of the NDK includes support for the x86 ABI and other minor changes.
For detailed information describing the changes in this release, read the
CHANGES.HTML document included in the NDK package.
- General notes:
-
- Adds support for the x86 ABI, which allows you to generate machine code
that runs on compatible x86-based Android devices. Major features for x86
include x86-specific toolchains, system headers, libraries and
debugging support. For all of the details regarding x86 support,
seedocs/CPU-X86.htmlin the NDK package.By default, code is generated for ARM-based devices, but you can add x86 to your
APP_ABIdefinition in yourApplication.mkfile to build
for x86 platforms. For example, the following line instructsndk-build
to build your code for three distinct ABIs:APP_ABI := armeabi armeabi-v7a x86
Unless you rely on ARM-based assembly sources, you shouldn’t need to touch
yourAndroid.mkfiles to build x86 machine code. - You can build a standalone x86 toolchain using the
--toolchain=x86-4.4.3
option when callingmake-standalone-toolchain.sh. See
docs/STANDALONE-TOOLCHAIN.htmlfor more details. - The new
ndk-stacktool lets you translate stack traces in
logcatthat are generated by native code. The tool translates
instruction addresses into a readable format that contains things such
as the function, source file, and line number corresponding to each stack frame.
For more information and a usage example, seedocs/NDK-STACK.html.
- Adds support for the x86 ABI, which allows you to generate machine code
- Other changes:
arm-eabi-4.4.0, which had been deprecated since NDK r5, has been
removed from the NDK distribution.
Android NDK, Revision 5c (June 2011)
This release of the NDK does not include any new features compared to r5b. The r5c release
addresses the following problems in the r5b release:
- Important bug fixes:
-
ndk-build: Fixed a rare bug that appeared when trying to perform parallel
builds of debuggable projects.- Fixed a typo that prevented
LOCAL_WHOLE_STATIC_LIBRARIESto work
correctly with the new toolchain and added documentation for this in
docs/ANDROID-MK.html. - Fixed a bug where code linked against
gnustl_staticcrashed when run on
platform releases older than API level 8 (Android 2.2). ndk-gdb: Fixed a bug that caused a segmentation fault when debugging Android 3.0
or newer devices.<android/input.h>: Two functions that were introduced in API level
9 (Android 2.3) were incorrect and are fixed. While this breaks the source API, the
binary interface to the system is unchanged. The incorrect functions were missing a
history_indexparameter, and the correct definitions are shown below:float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index, size_t history_index); float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index, size_t history_index);- Updated the C library ARM binary for API level 9 (Android 2.3) to correctly expose at
link time new functions that were added in that API level (for example,
pthread_rwlock_init).
- Minor improvements and fixes:
-
- Object files are now always linked in the order they appear in
LOCAL_SRC_FILES. This was not the case previously because the files were
grouped by source extensions instead. - When
import-modulefails, it now prints the list of directories that
were searched. This is useful to check that theNDK_MODULE_PATHdefinition
used by the build system is correct. - When
import-modulesucceeds, it now prints the directory where the
module was found to the log (visible withNDK_LOG=1). - Increased the build speed of debuggable applications when there is a very large number
of include directories in the project. ndk-gdb: Better detection ofadb shellfailures and improved
error messages.<pthread.h>: Fixed the definition of
PTHREAD_RWLOCK_INITIALIZERfor API level 9 (Android 2.3) and higher.- Fixed an issue where a module could import itself, resulting in an infinite loop in
GNU Make. - Fixed a bug that caused the build to fail if
LOCAL_ARM_NEONwas set to
true (typo inbuild/core/build-binary.mk). - Fixed a bug that prevented the compilation of .s assembly files
(.Sfiles were okay).
- Object files are now always linked in the order they appear in

This release of the NDK does not include any new features compared to r5. The r5b release addresses the
following problems in the r5 release:
- The r5 binaries required glibc 2.11, but the r5b binaries are generated with a special
toolchain that targets glibc 2.7 or higher instead. The Linux toolchain binaries now run on Ubuntu 8.04 or higher. - Fixes a compiler bug in the arm-linux-androideabi-4.4.3 toolchain.
The previous binary generated invalid thumb instruction sequences when
dealing with signed chars. - Adds missing documentation for the
«gnustl_static» value for APP_STL, that allows you to link against
a static library version of GNU libstdc++. - The following
ndk-buildissues are fixed:- A bug that created inconsistent dependency files when a
compilation error occured on Windows. This prevented a proper build after
the error was fixed in the source code. - A Cygwin-specific bug where using very short paths for
the Android NDK installation or the project path led to the
generation of invalid dependency files. This made incremental builds
impossible. - A typo that prevented the cpufeatures library from working correctly
with the new NDK toolchain. - Builds in Cygwin are faster by avoiding calls to
cygpath -m
from GNU Make for every source or object file, which caused problems
with very large source trees. In case this doesn’t work properly, defineNDK_USE_CYGPATH=1in your
environment to usecygpath -magain. - The Cygwin installation now notifies the user of invalid installation paths that contain spaces. Previously, an invalid path
would output an error that complained about an incorrect version of GNU Make, even if the right one was installed.
- A bug that created inconsistent dependency files when a
- Fixed a typo that prevented the
NDK_MODULE_PATHenvironment variable from working properly when
it contained multiple directories separated with a colon. - The
prebuilt-common.shscript contains fixes to check the compiler for 64-bit
generated machine code, instead of relying on the host tag, which
allows the 32-bit toolchain to rebuild properly on Snow Leopard. The toolchain rebuild scripts now also support
using a 32-bit host toolchain. - A missing declaration for
INET_ADDRSTRLENwas added to<netinet/in.h>. - Missing declarations for
IN6_IS_ADDR_MC_NODELOCALandIN6_IS_ADDR_MC_GLOBALwere added to<netinet/in6.h>. - ‘asm’ was replaced with ‘__asm__’ in
<asm/byteorder.h>to allow compilation with-std=c99.

This release of the NDK includes many new APIs, most of which are introduced to
support the development of games and similar applications that make extensive use
of native code. Using the APIs, developers have direct native access to events, audio,
graphics and window management, assets, and storage. Developers can also implement the
Android application lifecycle in native code with help from the new
NativeActivity class. For detailed information describing the changes in this
release, read the CHANGES.HTML document included in the downloaded NDK package.
- General notes:
-
- Adds support for native activities, which allows you to implement the
Android application lifecycle in native code. - Adds native support for the following:
- Input subsystem (such as the keyboard and touch screen)
- Access to sensor data (accelerometer, compass, gyroscope, etc).
- Event loop APIs to wait for things such as input and sensor events.
- Window and surface subsystem
- Audio APIs based on the OpenSL ES standard that support playback and recording
as well as control over platform audio effects - Access to assets packaged in an
.apkfile.
- Includes a new toolchain (based on GCC 4.4.3), which generates better code, and can also now
be used as a standalone cross-compiler, for people who want to build their stuff with
./configure && make. See
docs/STANDALONE-TOOLCHAIN.html for the details. The binaries for GCC 4.4.0 are still provided,
but the 4.2.1 binaries were removed. - Adds support for prebuilt static and shared libraries (docs/PREBUILTS.html) and module
exports and imports to make sharing and reuse of third-party modules much easier
(docs/IMPORT-MODULE.html explains why). - Provides a default C++ STL implementation (based on STLport) as a helper module. It can be used either
as a static or shared library (details and usage examples are in sources/android/stlport/README). Prebuilt
binaries for STLport (static or shared) and GNU libstdc++ (static only) are also provided if you choose to
compile against those libraries instead of the default C++ STL implementation.
C++ Exceptions and RTTI are not supported in the default STL implementation. For more information, see
docs/CPLUSPLUS-SUPPORT.HTML. - Includes improvements to the
cpufeatureshelper library that improves reporting
of the CPU type (some devices previously reported ARMv7 CPU when the device really was an ARMv6). We
recommend developers that use this library to rebuild their applications then
upload to Google Play to benefit from the improvements. - Adds an EGL library that lets you create and manage OpenGL ES textures and
services. - Adds new sample applications,
native-plasmaandnative-activity,
to demonstrate how to write a native activity. - Includes many bugfixes and other small improvements; see docs/CHANGES.html for a more
detailed list of changes.
- Adds support for native activities, which allows you to implement the

- NDK r4b notes:
-
Includes fixes for several issues in the NDK build and debugging scripts — if
you are using NDK r4, we recommend downloading the NDK r4b build. For detailed
information describing the changes in this release, read the CHANGES.TXT document
included in the downloaded NDK package.
- General notes:
-
- Provides a simplified build system through the new
ndk-buildbuild
command. - Adds support for easy native debugging of generated machine code on production
devices through the newndk-gdbcommand. - Adds a new Android-specific ABI for ARM-based CPU architectures,
armeabi-v7a. The new ABI extends the existingarmeabiABI to
include these CPU instruction set extensions:- Thumb-2 instructions
- VFP hardware FPU instructions (VFPv3-D16)
- Optional support for ARM Advanced SIMD (NEON) GCC intrinsics and VFPv3-D32.
Supported by devices such as Verizon Droid by Motorola, Google Nexus One, and
others.
- Adds a new
cpufeaturesstatic library (with sources) that lets your
app detect the host device’s CPU features at runtime. Specifically, applications can
check for ARMv7-A support, as well as VFPv3-D32 and NEON support, then provide separate
code paths as needed. - Adds a sample application,
hello-neon, that illustrates how to use the
cpufeatureslibrary to check CPU features and then provide an optimized
code path using NEON instrinsics, if supported by the CPU. - Lets you generate machine code for either or both of the instruction sets supported
by the NDK. For example, you can build for both ARMv5 and ARMv7-A architectures at the
same time and have everything stored to your application’s final
.apk. - To ensure that your applications are available to users only if their devices are
capable of running them, Google Play now filters applications based on the
instruction set information included in your application — no action is needed on
your part to enable the filtering. Additionally, the Android system itself also checks
your application at install time and allows the installation to continue only if the
application provides a library that is compiled for the device’s CPU architecture. - Adds support for Android 2.2, including a new stable API for accessing the pixel
buffers ofBitmapobjects from native code.
- Provides a simplified build system through the new

- General notes:
-
- Adds OpenGL ES 2.0 native library support.
- Adds a sample application,
hello-gl2, that illustrates the use of
OpenGL ES 2.0 vertex and fragment shaders. - The toolchain binaries have been refreshed for this release with GCC 4.4.0, which
should generate slightly more compact and efficient machine code than the previous one
(4.2.1). The NDK also still provides the 4.2.1 binaries, which you can optionally use
to build your machine code.

Originally released as «Android 1.6 NDK, Release 1».
- General notes:
-
- Adds OpenGL ES 1.1 native library support.
- Adds a sample application,
san-angeles, that renders 3D graphics
through the native OpenGL ES APIs, while managing activity lifecycle with aGLSurfaceViewobject.

Originally released as «Android 1.5 NDK, Release 1».
- General notes:
-
- Includes compiler support (GCC) for ARMv5TE instructions, including Thumb-1
instructions. - Includes system headers for stable native APIs, documentation, and sample
applications.
- Includes compiler support (GCC) for ARMv5TE instructions, including Thumb-1
System and Software Requirements
The sections below describe the system and software requirements for using the Android NDK, as
well as platform compatibility considerations that affect appplications using libraries produced
with the NDK.
The Android SDK
- A complete Android SDK installation (including all dependencies) is required.
- Android 1.5 SDK or later version is required.
Supported operating systems
- Windows XP (32-bit) or Vista (32- or 64-bit)
- Mac OS X 10.4.8 or later (x86 only)
- Linux (32 or 64-bit; Ubuntu 8.04, or other Linux distributions using GLibc 2.7 or
later)
Required development tools
- For all development platforms, GNU Make 3.81 or later is required. Earlier versions of GNU
Make might work but have not been tested. - A recent version of awk (either GNU Awk or Nawk) is also required.
- For Windows, Cygwin 1.7 or higher is required. The NDK
will not work with Cygwin 1.5 installations.
Android platform compatibility
- The native libraries created by the Android NDK can only be used on devices running
specific minimum Android platform versions. The minimum required platform version depends on
the CPU architecture of the devices you are targeting. The following table details which
Android platform versions are compatible with native code developed for specific CPU
architectures.Native Code CPU Architecture Used Compatible Android Platform(s) ARM, ARM-NEON Android 1.5 (API Level 3) and higher x86 Android 2.3 (API Level 9) and higher MIPS Android 2.3 (API Level 9) and higher These requirements mean you can use native libraries produced with the NDK in
applications that are deployable to ARM-based devices running Android 1.5 or later. If you are
deploying native libraries to x86 and MIPS-based devices, your application must target Android
2.3 or later. - To ensure compatibility, an application using a native library produced with the NDK
must declare aelement in its manifest file, with an
<uses-sdk>
android:minSdkVersionattribute value of «3» or higher. For example:<manifest> <uses-sdk android:minSdkVersion="3" /> ... </manifest>
- If you use this NDK to create a native library that uses the OpenGL ES APIs, the
application containing the library can be deployed only to devices running the minimum platform
versions described in the table below. To ensure compatibility, make sure that your application
declares the properandroid:minSdkVersionattribute value, as shown in the
following table. -
OpenGL ES Version Used Compatible Android Platform(s) Required uses-sdk Attribute OpenGL ES 1.1 Android 1.6 (API Level 4) and higher android:minSdkVersion="4"OpenGL ES 2.0 Android 2.0 (API Level 5) and higher android:minSdkVersion="5"For more information about API Level and its relationship to Android platform versions,
see Android API Levels. - Additionally, an application using the OpenGL ES APIs should declare a
<uses-feature>element in its manifest, with an
android:glEsVersionattribute that specifies the minimum OpenGl ES version
required by the application. This ensures that Google Play will show your application only
to users whose devices are capable of supporting your application. For example:<manifest> <uses-feature android:glEsVersion="0x00020000" /> ... </manifest>
For more information, see the
<uses-feature>
documentation. - If you use this NDK to create a native library that uses the API to access Android
Bitmappixel buffers or utilizes native activities, the application
containing the library can be deployed only to devices running Android 2.2 (API levelor
higher. To ensure compatibility, make sure that your application declares<uses-sdkattribute value in its manifest.
android:minSdkVersion="8" />
Installing the NDK
Installing the NDK on your development computer is straightforward and involves extracting the
NDK from its download package.
Before you get started make sure that you have downloaded the latest Android SDK and upgraded your applications and environment as
needed. The NDK is compatible with older platform versions but not older versions of the SDK tools.
Also, take a moment to review the System and
Software Requirements
for the NDK, if you haven’t already.
To install the NDK, follow these steps:
- From the table at the top of this page, select the NDK package that is appropriate for your
development computer and download the package. - Uncompress the NDK download package using tools available on your computer. When
uncompressed, the NDK files are contained in a directory called
android-ndk-<version>. You can rename the NDK directory if necessary and you
can move it to any location on your computer. This documentation refers to the NDK directory as
<ndk>.
You are now ready to start working with the NDK.
Getting Started with the NDK
Once you’ve installed the NDK successfully, take a few minutes to read the documentation
included in the NDK. You can find the documentation in the <ndk>/docs/
directory. In particular, please read the OVERVIEW.HTML document completely, so that you
understand the intent of the NDK and how to use it.
If you used a previous version of the NDK, take a moment to review the list of NDK changes in
the CHANGES.HTML document.
Here’s the general outline of how you work with the NDK tools:
- Place your native sources under
<project>/jni/... - Create
<project>/jni/Android.mkto describe your native sources to the
NDK build system - Optional: Create
<project>/jni/Application.mk. - Build your native code by running the ‘ndk-build’ script from your project’s directory. It
is located in the top-level NDK directory:cd <project> <ndk>/ndk-build
The build tools copy the stripped, shared libraries needed by your application to the
proper location in the application’s project directory. - Finally, compile your application using the SDK tools in the usual way. The SDK build tools
will package the shared libraries in the application’s deployable.apkfile.
For complete information on all of the steps listed above, please see the documentation
included with the NDK package.
Using the NDK
The Android framework provides two ways to use native code:
- Write your application using the Android framework and use JNI to access the APIs provided
by the Android NDK. This technique allows you to take advantage of the convenience of the
Android framework, but still allows you to write native code when necessary. If you use this
approach, your application must target specific, minimum Android platform levels, see Android platform compatibility for more information. -
Write a native activity, which allows you to implement the lifecycle callbacks in native
code. The Android SDK provides theNativeActivityclass, which is a
convenience class that notifies your
native code of any activity lifecycle callbacks (onCreate(),onPause(),
onResume(), etc). You can implement the callbacks in your native code to handle
these events when they occur. Applications that use native activities must be run on Android
2.3 (API Level 9) or later.You cannot access features such as Services and Content Providers natively, so if you want
to use them or any other framework API, you can still write JNI code to do so.
Contents of the NDK
The NDK contains the APIs, documentation, and sample
applications that help you write your native code. Specifically:
- A set of tools and build files used to generate native code libraries from C and C++
sources - A way to embed the corresponding native libraries into an application package file
(.apk) that can be deployed on Android devices - A set of native system headers and libraries that will be supported in all future versions
of the Android platform, starting from Android 1.5. Applications that use native activities
must be run on Android 2.3 or later. - Documentation, samples, and tutorials
The latest release of the NDK supports the following instruction sets:
- ARMv5TE, including Thumb-1 instructions (see
docs/CPU-ARCH-ABIS.htmlfor more
information) - ARMv7-A, including Thumb-2 and VFPv3-D16 instructions, with optional support for
NEON/VFPv3-D32 instructions (seedocs/CPU-ARM-NEON.htmlfor more information) - x86 instructions (see
docs/CPU-X86.htmlfor more information) - MIPS instructions (see
docs/CPU-MIPS.htmlfor more information)
ARMv5TE machine code will run on all ARM-based Android devices. ARMv7-A will run only on
devices such as the Verizon Droid or Google Nexus One that have a compatible CPU. The main
difference between the two instruction sets is that ARMv7-A supports hardware FPU, Thumb-2, and
NEON instructions. You can target either or both of the instruction sets — ARMv5TE is the
default, but switching to ARMv7-A is as easy as adding a single line to the application’s
Application.mk file, without needing to change anything else in the file. You can also build for
both architectures at the same time and have everything stored in the final .apk.
Complete information is provided in the CPU-ARCH-ABIS.HTML in the NDK package.
The NDK provides stable headers for libc (the C library), libm (the Math library), OpenGL ES
(3D graphics library), the JNI interface, and other libraries, as listed in the Development tools section.
Development tools
The NDK includes a set of cross-toolchains (compilers, linkers, etc..) that can generate
native ARM binaries on Linux, OS X, and Windows (with Cygwin) platforms.
It provides a set of system headers for stable native APIs that are guaranteed to be supported
in all later releases of the platform:
- libc (C library) headers
- libm (math library) headers
- JNI interface headers
- libz (Zlib compression) headers
- liblog (Android logging) header
- OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
- libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
- A Minimal set of headers for C++ support
- OpenSL ES native audio libraries
- Android native application APIS
The NDK also provides a build system that lets you work efficiently with your sources, without
having to handle the toolchain/platform/CPU/ABI details. You create very short build files to
describe which sources to compile and which Android application will use them — the build
system compiles the sources and places the shared libraries directly in your application
project.
Important: With the exception of the libraries listed above,
native system libraries in the Android platform are not stable and may change in future
platform versions. Your applications should only make use of the stable native system
libraries provided in this NDK.
Documentation
The NDK package includes a set of documentation that describes the capabilities of the NDK and
how to use it to create shared libraries for your Android applications. In this release, the
documentation is provided only in the downloadable NDK package. You can find the documentation in
the <ndk>/docs/ directory. Included are these files (partial listing):
-
INSTALL.HTML — describes how to install the NDK and configure it for your host
system - OVERVIEW.HTML — provides an overview of the NDK capabilities and usage
- ANDROID-MK.HTML — describes the use of the Android.mk file, which defines the native
sources you want to compile - APPLICATION-MK.HTML — describes the use of the Application.mk file, which describes
the native sources required by your Android application - CPLUSPLUS-SUPPORT.HTML — describes the C++ support provided in the Android NDK
- CPU-ARCH-ABIS.HTML — a description of supported CPU architectures and how to target
them. - CPU-FEATURES.HTML — a description of the
cpufeaturesstatic library that
lets your application code detect the target device’s CPU family and the optional features at
runtime. - CHANGES.HTML — a complete list of changes to the NDK across all releases.
- DEVELOPMENT.HTML — describes how to modify the NDK and generate release packages for it
- HOWTO.HTML — information about common tasks associated with NDK development
- IMPORT-MODULE.HTML — describes how to share and reuse modules
- LICENSES.HTML — information about the various open source licenses that govern the Android NDK
- NATIVE-ACTIVITY.HTML — describes how to implement native activities
- NDK-BUILD.HTML — describes the usage of the ndk-build script
- NDK-GDB.HTML — describes how to use the native code debugger
- PREBUILTS.HTML — information about how shared and static prebuilt libraries work
- STANDALONE-TOOLCHAIN.HTML — describes how to use Android NDK toolchain as a standalone
compiler (still in beta). - SYSTEM-ISSUES.HTML — known issues in the Android system images that you should be
aware of, if you are developing using the NDK. - STABLE-APIS.HTML — a complete list of the stable APIs exposed by headers in the
NDK.
Additionally, the package includes detailed information about the «bionic» C library provided
with the Android platform that you should be aware of, if you are developing using the NDK. You
can find the documentation in the <ndk>/docs/system/libc/ directory:
- OVERVIEW.HTML — provides an overview of the «bionic» C library and the features it
offers.
Sample apps
The NDK includes sample applications that illustrate how to use native code in your Android
applications:
hello-jni— a simple application that loads a string from a native
method implemented in a shared library and then displays it in the application UI.two-libs— a simple application that loads a shared library dynamically
and calls a native method provided by the library. In this case, the method is implemented in a
static library imported by the shared library.san-angeles— a simple application that renders 3D graphics through the
native OpenGL ES APIs, while managing activity lifecycle with aGLSurfaceViewobject.hello-gl2— a simple application that renders a triangle using OpenGL ES
2.0 vertex and fragment shaders.hello-neon— a simple application that shows how to use the
cpufeatureslibrary to check CPU capabilities at runtime, then use NEON intrinsics
if supported by the CPU. Specifically, the application implements two versions of a tiny
benchmark for a FIR filter loop, a C version and a NEON-optimized version for devices that
support it.bitmap-plasma— a simple application that demonstrates how to access the
pixel buffers of AndroidBitmapobjects from native code, and uses
this to generate an old-school «plasma» effect.native-activity— a simple application that demonstrates how to use the
native-app-glue static library to create a native activitynative-plasma— a version of bitmap-plasma implemented with a native
activity.
For each sample, the NDK includes the corresponding C source code and the necessary Android.mk
and Application.mk files. There are located under <ndk>/samples/<name>/
and their source code can be found under <ndk>/samples/<name>/jni/.
You can build the shared libraries for the sample apps by going into
<ndk>/samples/<name>/ then calling the ndk-build command.
The generated shared libraries will be located under
<ndk>/samples/<name>/libs/armeabi/ for (ARMv5TE machine code) and/or
<ndk>/samples/<name>/libs/armeabi-v7a/ for (ARMv7 machine code).
Next, build the sample Android applications that use the shared libraries:
- If you are developing in Eclipse with ADT, use the New Project Wizard to create a new
Android project for each sample, using the «Import from Existing Source» option and importing
the source from<ndk>/samples/<name>/. Then, set up an AVD,
if necessary, and build/run the application in the emulator. - If you are developing with Ant, use the
androidtool to create the build file
for each of the sample projects at<ndk>/samples/<name>/.
Then set up an AVD, if necessary, build your project in the usual way, and run it in the
emulator.
For more information about developing with the Android SDK tools and what
you need to do to create, build, and run your applications, see
the Overview
section for developing on Android.
Exploring the hello-jni Sample
The hello-jni sample is a simple demonstration on how to use JNI from an Android application.
The HelloJni activity receives a string from a simple C function and displays it in a
TextView.
The main components of the sample include:
- The familiar basic structure of an Android application (an
AndroidManifest.xml
file, asrc/andresdirectories, and a main activity) - A
jni/directory that includes the implemented source file for the native code
as well as the Android.mk file - A
tests/directory that contains unit test code.
- Create a new project in Eclipse from the existing sample source or use the
androidtool to update the project so it generates a build.xml file that you can
use to build the sample.- In Eclipse:
- Click File > New Android Project…
- Select the Create project from existing source radio button.
- Select any API level above Android 1.5.
- In the Location field, click Browse… and select
the<ndk-root>/samples/hello-jnidirectory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/hello-jnidirectory. - Run the following command to generate a build.xml file:
android update project -p . -s
- Change to the
- In Eclipse:
- Compile the native code using the
ndk-buildcommand.cd <ndk-root>/samples/hello-jni <ndk_root>/ndk-build
- Build and install the application as you would a normal Android application. If you are
using Eclipse, run the application to build and install it on a device. If you are using Ant,
run the following commands from the project directory:ant debug adb install bin/HelloJni-debug.apk
When you run the application on the device, the string Hello JNI should appear on
your device. You can explore the rest of the samples that are located in the
<ndk-root>/samples directory for more examples on how to use the JNI.
Exploring the native-activity Sample Application
The native-activity sample provided with the Android NDK demonstrates how to use the
android_native_app_glue static library. This static library makes creating a native activity
easier by providing you with an implementation that handles your callbacks in another thread, so
you do not have to worry about them blocking your main UI thread. The main parts of the sample
are described below:
- The familiar basic structure of an Android application (an
AndroidManifest.xml
file, asrc/andresdirectories). The AndroidManifest.xml declares
that the application is native and specifies the .so file of the native activity. SeeNativeActivityfor the source or see the
<ndk_root>/platforms/samples/native-activity/AndroidManifest.xmlfile. - A
jni/directory contains the native activity, main.c, which uses the
android_native_app_glue.hinterface to implement the activity. The Android.mk that
describes the native module to the build system also exists here.
To build this sample application:
- Create a new project in Eclipse from the existing sample source or use the
androidtool to update the project so it generates a build.xml file that you can
use to build the sample.- In Eclipse:
- Click File > New Android Project…
- Select the Create project from existing source radio button.
- Select any API level above Android 2.3.
- In the Location field, click Browse… and select
the<ndk-root>/samples/native-activitydirectory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/native-activitydirectory. - Run the following command to generate a build.xml file:
android update project -p . -s
- Change to the
- In Eclipse:
- Compile the native code using the
ndk-buildcommand.cd <ndk-root>/platforms/samples/android-9/samples/native-activity <ndk_root>/ndk-build
- Build and install the application as you would a normal Android application. If you are
using Eclipse, run the application to build and install it on a device. If you are using Ant,
run the following commands in the project directory, then run the application on the device:ant debug adb install bin/NativeActivity-debug.apk

or

(1 votes, average: 4.00 out of 5)










