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.
Android NDK, Revision 10d (December 2014)
- 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.6
to ndk-build, or
add--toolchain=arm-linux-androideabi-4.6
when executing
make-standalone-toolchain.sh
on the command line. GCC 4.9 remains the
default for 64-bit ABIs. - Stopped all x86[_64] toolchains from adding
-mstackrealign
by 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 -pie
when 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/vsscanf
hang 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
-Os
was specified. (Issue 77571)
- Made more fixes related to
- Other bug fixes:
-
- Made the following header and library fixes:
- Added
posix_memalign
to API level 16. Also, added a prototype in
stdlib.h
to API levels 16 to 19.
(Issue 77861) - Fixed
stdatomic.h
so 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.h
to renamemxcsr_mask
asmxcr_mask
,
and to change the data type foru_ar0
- Changed
sysconf()
return value type fromint
to
long
. - Fixed ndk-build’s handling of
thumb
forLOCAL_ARM_MODE
: In
r10d, ndk-build addsLOCAL_LDFLAGS+=-mthumb
by default, unless one of the
following conditions applies: - You have set
LOCAL_ARM_MODE
equal toarm
. - You are doing a debug build (with settings such as
APP_OPTIM=debug
and
AndroidManifest.xml
containingandroid:debuggable="true"
),
where ARM mode is the default in order to retain compatibility with earlier toolchains.
(Issue 74040) - Fixed
LOCAL_SRC_FILES
in 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_PCH
to improve Clang support. (Issue
77575) - Clarified «requires executable stack» warning from ld.gold. (Issue
79115)
from
unsigned long
to struct user_regs_struct*.
Android NDK, Revision 10c (October 2014)
- 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-L
to the official release
designation:android-21
. - Updated GCC 4.9 by rebasing to the
google
branch
of the GCC repository. Major differences from the upstream version of GCC 4.9 include: - The
-O2
option 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-as
as 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-on
option. For more information,
seeprebuilt/common/gdb/common.setup
in 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
--icf
option. - Broadened
arm_neon.h
support 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-neon
sample insamples/
. - See Intel’s guide to porting from ARM NEON to Intel SSE.
- Navigate to the NDK Programmer’s Guide (
- Documented support for
_FORTIFY_SOURCE
inheaders/libs/android-21
,
which appeared in r10 (whenandroid-21
was 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-argument
and-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.h
to improve compatibility with GCC 4.6, and provide support
for the<atomic>
header. - Added
sys/ucontext.h
andsys/user.h
to all API levels. The
signal.h
header now includes<sys/ucontext.h>
. You may
remove any existing definition ofstruct ucontext
. - Added
posix_memalign
to 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_nanosleep
andclock_settime
to 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_t
toint
in
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 thenew
anddelete
operators 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.sh
so 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-features
to 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.h
and
include-fixed/linux/compiler.h
headers from the GCC compiler.
(Issue 73728) - Fixed an issue related to
-flto
with 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 (
Android NDK, Revision 10b (September 2014)
- 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.2
and-mpopcnt
by default. (Issue 73843.)
- Other bug fixes:
-
- Removed
stdio.h
from 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.h
andwchar.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_nxthdr
to__cmsg_nxthdr
. - Removed
__libc_malloc_dispatch
. - Changed the
ptrace()
prototype tolong ptrace(int, ...);
. - Removed
sha1.h
. - Extended
android_dlextinfo
inandroid/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.9
andmips64el-linux-android-4.9
, implementing a new multilib directory layout, and providing support for gdb-7.7 - Enhanced
cpu-features
to detect more arm64 features. (Change list 100339.)
- Updated
Android NDK, Revision 10 (July 2014)
- 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
all32
andall64
settings forAPP_ABI
.APP_ABI=all32
is equivalent to
APP_ABI=armeabi,armeabi-v7a,x86,mips
.APP_ABI=all64
is equivalent to
APP_ABI=arm64-v8a,x86_64,mips64
.APP_ABI=all
selects all ABIs.
- The new GNU libstdc++ in Android-L contains all
<tr1/cmath>
Before defining your own math function, check_GLIBCXX_USE_C99_MATH_TR1
to 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.h
header 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.9
toApplication.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.sh
script. 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.8
or4.9
to enable ndk-gdb to select GDB 7.6. - Added the
-mssse3
build 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-aliasing
if 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
-O3
assert 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_t
to beint
instead oflong
.
int - Fixed
WCHAR_MIN
andWCHAR_MAX
so 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_t
to be 16 bits, use-fshort-wchar
. - Removed non-existent symbols from 32-bit
libc.so
, and addedpread64
,
pwrite64
,ftruncate64
for
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-pie
for Android
targets if neither-shared
nor-static
existed. This behavior, which was
incorrect, caused the linker to complain that-shared
and-pie
could 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.h
to 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
Android NDK, Revision 9d (March 2014)
- Important changes:
-
- Added support for the Clang 3.4 compiler. The
NDK_TOOLCHAIN_VERSION=clang
option 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-build
script, 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-v7a
and
armeabi-v7a-hard
as 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.sh
script copies
additional libaries under/hard
directories.
Add the aboveCFLAGS
andLFLAGS
to your
makefile to enable GCC or Clang to link with
libraries in/hard
. - Added the yasm assembler, as well as
LOCAL_ASMFLAGS
andEXPORT_ASMFLAGS
flags for x86
targets. Thendk-build
script uses
prebuilts/*/bin/yasm*
to buildLOCAL_SRC_FILES
that
have the.asm
extension. - 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++_static
orAPP_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.h
for Android API level 13 and higher.
(Issue 64988) - Fixed a missing
#include
in
android/rect_manager.h
for Android API level 14 and higher. - Added
JNICALL
toJNI_OnLoad
and
JNI_OnUnload
injni.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.h
for all architectures. MIPS
developers can now include this header instead of writing#ifdef
.
__mips__ - Fixed
platforms/android-18/include/android/input.h
by 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_VALUE
for Android API
level 9 and lower. - Added
scalbln
,scalblnf
, and
scalblnl
to x86libm.so
for 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-build
script to add
-rpath-link=$SYSROOT/usr/lib
and
-rpath-link=$TARGET_OUT
in order to useld.bfd
to
link executables. (Issue 64266)- Removed
-Bsymbolic
from all STL builds.- Fixed
ndk-gdb-py.cmd
by settingSHELL
as
an environment variable
instead of passing it to
python.exe
, which ignores the setting.
(Issue 63054)- Fixed the
make-standalone-toolchain.sh
script so that
the--stl=stlport
option copies the gabi++ headers instead of
symlinking them; thecmd.exe
and MinGW shells do not understand
symlinks created by cygwin. - Header fixes:
- Other changes:
-
- Applied execution permissions to all
*cmd
scripts
previously intended for use only in thecmd.exe
shell, in case
developers prefer to usendk-build.cmd
in cygwin instead of the
recommendedndk-build
script. - 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
Android NDK, Revision 9c (December 2013)
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-float
support for
__builtin
math functions. For ongoing information on fixes for
-mhard-float
with 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
poll
topoll(struct
in
pollfd *, nfds_t, int);poll.h
. - Added
utimensat
tolibc.so
for Android
API levels 12 and 19. These libraries are now included for all Android API
levels 12 through 19. - Introduced
futimens
intolibc.so
, for Android API
level 19. - Added missing
clock_settime()
and
clock_nanosleep()
totime.h
for Android API level 8
and higher. - Added
CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE,
and
CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME, CLOCK_REALTIME_ALARM,
CLOCK_BOOTTIME_ALARM
intime.h.
- Removed obsolete
CLOCK_REALTIME_HR
and
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_ReleaseStringUTFChars
in
/system/lib/libdvm.so
that was causing crashes on x86 devices.
- Fixed
ndk-build
fails that happen in cygwin when the NDK
package is
referenced via symlink. - Fixed
ndk-build.cmd
fails that happen in windows
cmd.exe
when
LOCAL_SRC_FILES
contains absolute paths. (Issue 69992) - Fixed the
ndk-stack
script 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-stack
stack 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=null
setting for use in an
integrated build system where options are explicitly passed to
ndk-build
. With this setting,ndk-build
makes 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_ABI
can 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
-g
option. This option
helps thendk-stack
script provide better a stack dump across STL.
This change should not affect the code/size of the final, stripped file. - Enhanced
hello-jni
samples to reportAPP_ABI
at
compilation. - Used the
ar
tool in Deterministic mode (option
-D
) to build static libraries. (Issue 60705)
- Added
Android NDK, Revision 9b (October 2013)
- Important changes:
-
- Updated
include/android/*h
andmath.h
for 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-float
in 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_COLORS
as 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
thumb2
failing 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.exe
executables 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.exidx
data 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_MIN
andWCHAR_MAX
to be unsigned according to
spec (the X86/MIPS versions are signed). Define_WCHAR_IS_ALWAYS_SIGNED
to
restore old behavior. (Issue 57749) - Fixed
include/netinet/tcp.h
to containTCP_INFO
state enum.
(Issue 38881) - Fixed the
cdefs_elh.h
macro_C_LABEL_STRING
to stop generating
warnings in the GCC 4.8 toolchain when using c++11 mode.
(Issue 58135,
Issue 58652) - Removed non-existent functions
imaxabs
andimaxdiv
from 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/gles3jni
with Clang on Android API level 11. - Fixed MCLinker to allow multiple occurrences of the following options:
-gc-sections
and--eh-frame-hdr
. - Fixed MCLinker to accept the
--no-warn-mismatch
option. - Modified
cpu-features
option 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.c
erroneously 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-as
option so it can pass
tests forssax-instructions
andfenv
. - Fixed GCC 4.6/4.7/4.8 compiler to pass the linker option
--eh-frame-hdr
even
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.mcld
significantly (1.5MB vs.ld.bfd
3.5MB and
ld.gold
7.5MB), resulting in a speed improvement of approximately 20%. - Added
LOCAL_CONLYFLAGS
andAPP_CONLYFLAGS
to specify
options applicable to C only but not C++. The existingLOCAL_CFLAGS
andAPP_CFLAGS
are also used for C++ compilation (to save trouble of
specifying most options twice), so options such as-std=gnu99
may 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.a
files are built with
-funwind-tables
to 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-sdc1
to control ldxc1/sdxc1 too - Added crazy linker. For more information, see
sources/android/crazy_linker/README.TXT
. - Fixed
bitmap-plasma
to 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
Android NDK, Revision 9 (July 2013)
- Important changes:
-
- Added support for Android 4.3 (API level 18). For more information, see
STABLE-APIS.html
and 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-build
builds, exportNDK_TOOLCHAIN_VERSION=4.8
or
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-typedefs
option 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-access
build option when building for kernels that do not support
this feature. - For
- Added Clang 3.3 support. The
NDK_TOOLCHAIN_VERSION=clang
build 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=mcld
in
LOCAL_LDFLAGS
orAPP_LDFLAGS
to enable MCLinker. - Added
ndk-depends
tool 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
-O
values when using Boost
1.52.0. (Issue 42891) - Fixed
libc.so
andlibc.a
to support thewait4()
function.
(Issue 19854) - Updated the x86 libc.so and libc.a files to include the
clone()
function. - Fixed
LOCAL_SHORT_COMMANDS
bug where thelinker.list
file is
empty or not used. - Fixed GCC MIPS build on Mac OS to use CFI directives, without which
ld.mcld --eh-frame-hdr
fails 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-gdb
script so that the--start
or--launch
actions
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--nowait
option to restore previous behavior. - Fixed GDB crash when library list is empty.
- Fixed GDB crash when using a
stepi
command past abx pc
or
blx pc
Thumb instruction.
(Issue 56962,
Issue 36149) - Fixed MIPS
gdbserver
to look forDT_MIPS_RLD_MAP
instead 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-build
script 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_Exception
to be 24 for MIPS build targets when
using the Clang compiler.
(Change 54141) - Fixed the
ndk-build
script to ensure that built libraries are actually
removed from projects that include prebuilt static libraries when using the
ndk-build clean
command.
(Change 54461,
Change 54480) - Modified the
NDK_ANALYZE=1
option to be less verbose. - Fixed
gnu-libstdc++/Android.mk
to include abackward/
path for builds
that use backward compability.
(Issue 53404) - Fixed a problem where
stlport new
sometimes returned random values. - Fixed
ndk-gdb
to 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/swap32
error:invalid 'asm': operand number
.
out of range
(Issue 54465,
Change 57242) - Fixed
ld.gold
to merge string literals. - Fixed
ld.gold
to handle large symbol alignment. - Updated
ld.gold
to enable the--sort-section=name
option. - Fixed GCC 4.4.3/4.6/4.7 to suppress the
-export-dynamic
option for
statically linked programs. GCC no longer adds an.interp
section for statically
linked programs. - Fixed GCC 4.4.3
stlport
compilation error about inconsistenttypedef
of_Unwind_Control_Block
.
(Issue 54426) - Fixed
awk
scripts to handleAndroidManifest.xml
files created on
Windows which may contain trailingr
characters and cause build errors.
(Issue 42548) - Fixed
make-standalone-toolchain.sh
to probe theprebuilts/
directory to detect if the host is 32 bit or 64 bit. - Fixed the Clang 3.2
-integrated-as
option. - Fixed the Clang 3.2 ARM EHABI compact model
pr1
andpr2
handler data. - Added Clang
-mllvm -arm-enable-ehabi
option 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-sdk
element in application
manifest. (Issue 57015)
- Fixed the
- Other changes:
-
- Header Fixes
- Modified headers to make
__set_errno
an inlined function, since
__set_errno
inerrno.h
is deprecated, andlibc.so
no longer
exports it. - Modified
elf.h
to includestdint.h
.
(Issue 55443) - Fixed
sys/un.h
to be included independently of other headers.
(Issue 53646) - Fixed all of the
MotionEvent_getHistorical
API family to take the
const AInputEvent* motion_event
.
(Issue 55873) - Fixed
malloc_usable_size
to takeconst void*
.
(Issue 55725) - Fixed stdint.h to be more compatible with C99.
(Change 46821) - Modified
wchar.h
to not redefineWCHAR_MAX
and
WCHAR_MIN
- Fixed
<inttypes.h>
declaration for pointer-relatedPRI
and
SCN
macros. (Issue 57218) - Changed the
sys/cdefs.h
header so that__WCHAR_TYPE__
is 32-bit
for API levels less than 9, which means thatwchat_t
is 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.sh
to support thestlport
library in addition tognustl
, when you specify the option
--stl=stlport
. For more information, seeSTANDALONE-TOOLCHAIN.html
. - Updated the
make-standalone-toolchain.sh
script so that the
--llvm-version=
option creates the$TOOLCHAIN_PREFIX-clang
and
$TOOLCHAIN_PREFIX-clang++
scripts in addition toclang
and
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-semantics
flag 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-promotion
flag 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_cast
to 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-sdc1
to the MIPS GCC and Clang compilers. By default, compilers
align 8-byte objects properly and emit theldc1
andsdc1
instructions
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 toldc1
andsdc1
operations on unaligned memory. In this
case, use the-mno-ldc1-sdc1
flag to workaround the problem. - Downgraded the event severity from warning to info if
APP_PLATFORM_LEVEL
is
larger thanAPP_MIN_PLATFORM_LEVEL
. TheAPP_PLATFORM_LEVEL
may be lower
thanAPP_PLATFORM
injni/Application.mk
because the NDK does not have
headers for all levels. In this case, the actual level is shifted downwards. The
APP_MIN_PLATFORM_LEVEL
is specified by theandroid:minSdkVersion
in
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-build
to use GCC 4.7’sas/ld
for Clang compiling.Note:
In GCC 4.7,monotonic_clock
andis_monotonic
have been renamed to
steady_clock
andis_steady
, respectively. - Added the following new warnings to the
ndk-build
script:- Added warnings if
LOCAL_LDLIBS/LDFLAGS
are 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/LDFLAGS
of a shared library or executable modules.
- Added warnings if
- Updated build scripts, so that if
APP_MODULES
is not defined and only static
libraries are listed inAndroid.mk
, the script force-builds all of them.
(Issue 53502) - Updated
ndk-build
to support absolute paths inLOCAL_SRC_FILES
. - Removed the
*-gdbtui
executables, which are duplicates of the*-gdb
executables with the-tui
option enabled. - Updated the build scripts to warn you when the Edison Design Group (EDG) compiler
front-end turns_STLP_HAS_INCLUDE_NEXT
back on.
(Issue 53646) - Added the environment variable
NDK_LIBS_OUT
to allow overriding of the
path forlibraries/gdbserver
from 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=true
to 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
Android NDK, Revision 8e (March 2013)
- Important changes:
-
- Added 64-bit host toolchain set (package name suffix
*-x86_64.*
). For more
information, seeCHANGES.HTML
andNDK-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_LIBRARIES
and
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_GTHREADS
for 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
cmov
behavior.
(GCC Issue) - Fixed handling NULL return value of
setlocale()
in libstdc++/GCC4.7.
(Issue 46718) - Fixed
ld.gold
runtime undefined reference to__exidx_start
and
__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:line
breakpoints when symbols
contain
long, indirect file paths.
(Issue 42448) - Fixed GDB
read_program_header
for MIPS PIE executables.
(Change 49592) - Fixed
STLport
segmentation fault inuncaught_exception()
.
(Change 50236) - Fixed
STLport
bus 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.h
header. - Fixed
stddef.h
to not redefineoffsetof
since it already exists
in the toolchain. - Fixed
elf.h
to containElf32_auxv_t
andElf64_auxv_t
.
(Issue 38441) - Fixed the
#ifdef
C++ definitions in the
OpenSLES_AndroidConfiguration.h
header file.
(Issue 53163)
- Removed redundant definitions of
- Fixed
STLport
to 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
cpufeatures
to not parse/proc/self/auxv
.
(Issue 43055) - Fixed
ld.gold
to not depend on host libstdc++ and on Windows platforms,
to not depend on thelibgcc_sjlj_1.dll
library. - Fixed Clang 3.1 which emits inconsistent register list in
.vsave
and 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
clang
andclang++
in standalone NDK compiler to detect
-cc1
and to not specify-target
when found. - Fixed
ndk-build
to observeNDK_APP_OUT
set inApplication.mk
. - Fixed X86
libc.so
andlib.a
which were missing thesigsetjmp
andsiglongjmp
functions 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-build
script warning in windows when running from project’s JNI
directory.
(Issue 40192) - Fixed problem where the
ndk-build
script does not build if makefile has
trailing whitespace in theLOCAL_PATH
definition.
(Issue 42841)
- Fixed NDK headers:
- Other changes:
-
- Enabled threading support in GCC/MIPS toolchain.
- Updated GCC exception handling helpers
__cxa_begin_cleanup
and
__cxa_type_match
to 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
STLport
is built for ARM in Thumb mode. - Added support for
std::set_new_handler
in Gabi++.
(Issue 52805) - Enabled
FUTEX
system call in GNU libstdc++. - Updated
ndk-build
so that it no longer copies prebuilt static library to
a project’sobj/local/<abi>/
directory.
(Issue 40302) - Removed
__ARM_ARCH_5*__
from ARMtoolchains/*/setup.mk
script.
(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
polly
for Clang 3.1 on Linux and Max OS X 32-bit hosts which analyzes
and optimizes memory access. (info) - Enabled
-flto
in 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
--plugin
and--plugin-opt
forld.gold
in GCC 4.6/4.7. - Enabled
--text-reorder
forld.gold
in GCC 4.7. - Configured GNU libstdc++ with
_GLIBCXX_USE_C99_MATH
which undefines the
isinf
script in the bionic header. For more information, see
CHANGES.html
. - Added
APP_LDFLAGS
to the build scripts. For more information, see
ANDROID-MK.html
. - Updated build scripts to allow
NDK_LOG=0
to disable theNDK_LOG
. - Updated build scripts to allow
NDK_HOST_32BIT=0
to disable the host developer
environment 32-bit toolchain. - Changed the default GCC/X86 flags
-march=
and-mtune=
from
pentiumpro
andgeneric
toi686
andatom
. - Enhanced toolchain build scripts:
- Fixed a race condition in
build-gcc.sh
for themingw
build type
which was preventing a significant amount of parallel build processing. - Updated
build-gabi++.sh
andbuild-stlport.sh
so they can now run
from the NDK package.
(Issue 52835) - Fixed
run-tests.sh
in theMSys
utilities collection. - Improved 64-bit host toolchain and Canadian Cross build support.
- Updated
build-mingw64-toolchain.sh
script to more recent version. - Added option to build
libgnustl_static.a
andstlport_static.a
without hidden visibility.
- Fixed a race condition in
Android NDK, Revision 8d (December 2012)
- 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.7
variable
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
stlport
exception support via gabi++. Note that the new gabi++
depends ondlopen
and related code, meaning that:- You can no longer build a static executable using the
-static
option or includelibstlport_static.a
using
APP_STL := stlport_static
. (You can still use the-static
option
with a standalone toolchain.) Compiling a dynamic executable using
include $(BUILD_EXECUTABLE)
continues to work because the compiler
automatically adds the-ldl
option. - If your project links using
-nostdlib
and {-Wl,—no-undefined}, you
must manually include the-ldl
option.
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-all
and-fstack-protector-strong
using the GCC 4.6
and higher compilers.Note: The
-mstack-protector-guard
setting itself does not
enable any-fstack-protector*
options. - Added
android_setCpu()
function to
sources/android/cpufeatures/cpu-features.c
for use when auto-detection via
/proc
is 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-build
script.
(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.1
option in Cygwin.
(Issue 39585) - Fixed the
make-standalone-toolchain.sh
script 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_ANDROIDBUFFERQUEUESOURCE
option in android-14 builds for
ARM and X86.
(Issue 40625) - Fixed x86 CPU detection for the
ANDROID_CPU_X86_FEATURE_MOVBE
feature.
(Issue 39317) - Fixed an issue preventing the Standard Template Library (STL) from using C++
sources that do not have a.cpp
file 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_t
to 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.h
anddirent.h
. - Fixed
limits.h
to includepage.h
which providesPAGE_SIZE
settings.
(Issue 39983) - Fixed return type of
glGetAttribLocation()
and
glGetUniformLocation()
fromint
toGLint
. - Fixed
__BYTE_ORDER
constant for x86 builds.
(Issue 39824)
- Fixed
- Fixed
ndk-build
script to not overwrite-Os
with-O2
for ARM
builds. - Fixed build scripts to allow overwriting of
HOST_AWK
,HOST_SED
, and
HOST_MAKE
settings. - Fixed issue for
ld.gold
onfsck_msdos
builds 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
duringsolib
events.
(Issue 38402) - Fixed missing
libgcc.a
file 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.sh
to accept the suffix-clang3.1
which is equivalent to adding--llvm-version=3.1
to 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.a
is built and
placed inlib32/
.
Android NDK, Revision 8c (November 2012)
- 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.1
or
add this environment variable setting toApplication.mk
. - For standalone builds, add
--llvm-version=3.1
to
make-standalone-toolchain.sh
and replaceCC
andCXX
in your
makefile with<tool-path>/bin/clang
and
<tool-path>/bin/clang++
. SeeSTANDALONE-TOOLCHAIN.html
for
details.
Note: This feature is experimental. Please try it and
report any issues. - For
- Added Gold linker
ld.gold
for 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=bfd
toAndroid.mk
, or by
passing
-fuse-ld=bfd
to the g++/clang++ command line that does the linking. - Added checks for spaces in the NDK path to the
ndk-build[.cmd]
and
ndk-gdb
scripts, 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-10
through
android-13
inAPP_PLATFORM
,project.properties
or
default.properties
link againstandroid-9
instead of
android-14
. - Updated build so that executables using android-16 (Jelly Bean) or higher are
compiled with the-fPIE
option for position-independent executables (PIE).
A newAPP_PIE
option allows you to control this behavior. SeeAPPLICATION-MK.html
for details.Note: All API levels above 14 still link against
platforms/android-14
and no newplatforms/android-N
have been added. - Modified
ndk-build
to provide warnings if the adjusted API level is larger
thanandroid:minSdkVersion
in the project’sAndroidManifest.xml
.
- Modified build logic so that projects that specify
- Updated the
cpu-features
helper library to include more ARM-specific features.
Seesources/android/cpufeatures/cpu-features.h
for 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-a
parameter
to the linker. This change ensures that v7-specific libraries andcrt*.o
are
linked correctly. - Added
-mfpu=vfpv3-d16
tondk-build
instead of the
-mfpu=vfp
option 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.sh
with 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++.a
is now preserved when copied.
- All files and executables in the NDK release package are set to have read and
- Removed redundant
r
from Windows prebuiltecho.exe
. The redundant
r
causedgdb.setup
to 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-mkdir
implementation.
(Issue 25875) - Fixed GCC 4.4.3 GNU
libstdc++
to not mergetypeinfo
names by
default. For more details, see
toolchain repo gcc/gcc-4.4.3/libstdc++-v3/libsupc++/typeinfo
.
(Issue 22165) - Fixed problem on
null
context in GCC 4.6
cp/mangle.c::write_unscoped_name
, where GCC may crash when the context is
null
and dereferenced inTREE_CODE
. - Fixed GCC 4.4.3 crashes on ARM NEON-specific type definitions for floats.
(Issue 34613) - Fixed the
STLport
internal_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-psabi
switch to avoid this warning is no longer required. - Fixed an issue when a project with
.arm
or.neon
suffixes in
LOCAL_SRC_FILES
also usedAPP_STL
. WithAPP_STL
, the
ndk-build
script searches for C++ files inLOCAL_SRC_FILES
before
adding STLheader/lib
paths to compilation. Modifiedndk-build
to
filter out.arm
and.neon
suffixes before the search, otherwise items
inLOCAL_SRC_FILES
likemyfile.cpp.arm.neon
won’t be compiled as C++
code. - Fixed
binutils-2.21/ld.bfd
to 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/ld
links prebuilt object by newerbinutils-2.21
- Fixed an issue in GNU
stdc++
compilation with both-mthumb
and
-march=armv7-a
, by modifyingmake-standalone-toolchain.sh
to populate
headers/libs
in 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-protector
for X86, which is also the default for the
ndk-build
x86 ABI target. - MIPS-specific fixes:
- Fixed
STLport
endian-ness by setting_STLP_LITTLE_ENDIAN
to 1 when
compiling MIPSlibstlport_*
. - Fixed GCC
__builtin_unreachable
issue when compiling LLVM.
(GCC Issue 54369) - Backported fix for
cc1
compile 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
gdb
with a hard-wired dependency on a specific version of Python.
(Issue 36120) - Fixed
ndk-gdb
whenAPP_ABI
containsall
and 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
solibs
when the linker is consistent.
This change speeds upsolib
event handling.
(Issue 37677) - Added fix to make repeated attempts to find
solib
breakpoints. GDB now
retriesenable_break()
during every call tosvr4_current_sos()
until
it succeeds.
(Change 43563) - Fixed an issue where
gdb
would not stop on breakpoints placed in
dlopen-ed
libraries.
(Issue 34856) - Fixed
SIGILL
in dynamic linker when callingdlopen()
, on system
where/system/bin/linker
is stripped of symbols and
rtld_db_dlactivity()
is implemented asThumb
, due to not preserving
LSB
ofsym_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
__unused
with__linux_unused
in
linux/sysctl.h
andlinux/icmp.h
to avoid conflict with
#define __unused
insys/cdefs.h
. - Fixed
fenv.h
for enclosed C functions with__BEGIN_DECLS
and
__END_DECLS
. - Removed unimplemented functions in
malloc.h
. - Fixed
stdint.h
defintion ofuint64_t
for ANSI compilers.
(Issue 1952) - Fixed preprocessor macros in
<arch>/include/machine/*
. - Replaced
link.h
for MIPS with new version supporting all platforms. - Removed
linux-unistd.h
- Move GLibc-specific macros
LONG_LONG_MIN
,LONG_LONG_MAX
and
ULONG_LONG_MAX
from<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 whenSTLport
is 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.so
so 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-undefined
options, you
must provide your own__dso_handle
becausecrtbegin_so.o
is not linked in
this case. The content of__dso_handle
does 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
objdump
forplt
entries to
generate a more readable formfunction@plt
. - Removed the following symbols, introduced in GCC 4.6
libgcc.a
, from
the X86 platformlibc.so
library:__aeabi_idiv0
,__aeabi_ldiv0
,
__aeabi_unwind_cpp_pr1
, and__aeabi_unwind_cpp_pr2
. - Removed unused
.ctors
,.dtors
, and.eh_frame
in MIPS
crt*_so.S
. - Updated
ndk-gdb
so that it only takes the last line of output for
ndk-build
DUMP_XXXX
. This change ensures that ifApplication.mk
or
Android.mk
print something with$(info ...)
syntax, it does not get
injected into the result ofDUMP_XXXX
.
(More info)
- Fixed NDK headers:
- Other changes:
-
- Removed
arch-x86
andarch-mips
headers 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-build
to recognize more C++ file extensions by default:
.cc .cp .cxx .cpp .CPP .c++ .C
. You may still useLOCAL_CPP_EXTENSION
to
overwrite these extension settings. - Fixed an issue in
samples/san-angeles
that caused a black screen or freeze
frame on re-launch. - Replaced deprecated APIs in NDK samples.
(Issue 20017)hello-gl2
from android-5 to android-7native-activity
from android-9 to android-10native-audio
from android-9 to android-10native-plasma
from 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-tag
are deprecated. - Added a new script
run-tests-all.sh
which callsrun-tests.sh
and
standalone/run.sh
with various conditions. The scriptrun-tests.sh
runs
without the--abi
option, and is enhanced to compile most of the tests for all
supported ABIs and run on all attached devices
- Removed
Android NDK, Revision 8b (July 2012)
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_COMMANDS
issues 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
,-d
and-s
to adb more
consistently. - Updated tool to accept device serial names containing spaces.
- Updated tool to retrieve
/system/bin/link
information, sogdb
on
the host can set a breakpoint in__dl_rtld_db_dlactivity
and be aware of linker activity
(e.g., rescansolib
symbols whendlopen()
is called).
- Updated tool to pass flags
- Fixed
ndk-build clean
on Windows, which was failing to remove
./libs/*/lib*.so
. - Fixed
ndk-build.cmd
to return a non-zeroERRORLEVEL
whenmake
fails. - Fixed
libc.so
to stop incorrectly exporting the__exidx_start
and
__exidx_end
symbols. - Fixed
SEGV
when unwinding the stack past__libc_init
for ARM and
MIPS.
- Fixed
- Important changes:
-
- Added GCC 4.6 toolchain (
binutils
2.21 withgold
and GDB 7.3.x) to
co-exist with the original GCC 4.4.3 toolchain (binutils
2.19 and GDB 6.6).- GCC 4.6 is now the default toolchain. You may set
NDK_TOOLCHAIN_VERSION=4.4.3
inApplication.mk
to select the original one. - Support for the
gold
linker is only available for ARM and x86
architectures on Linux and Mac OS hosts. This support is disabled by default. AddLOCAL_LDLIBS += -fuse-ld=gold
inAndroid.mk
to enable it. - Programs compiled with
-fPIE
require the newGDB
for debugging,
including binaries in Android 4.1 (API Level 16) system images. - The
binutils
2.21ld
tool contains back-ported fixes from
version 2.22:- Fixed
ld --gc-sections
, which incorrectly retains zombie references to
external libraries. (more
info). - Fixed ARM
strip
command to preserve the originalp_align
and
p_flags
inGNU_RELRO
section if they are valid. Without this fix, programs
built with-fPIE
could 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_now
protections by default:- Added
--noexecstack
to assembler and-z noexecstack
to linker
that provides NX protection against buffer overflow attacks by enabling NX bit on stack and
heap. - Added
-z relro
and-z now
to 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
--execstack
option for the
assembler and-z execstack
for the linker. - Disable hardening of internal data by setting the
-z norelro
and
-z lazy
options for the linker. - Disable these protections in the NDK
jni/Android.mk
by 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.html
for more details. - Disable NX protection by setting the
- Added
- Added branding for Android executables with the
.note.ABI-tag
section (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-gnu
relocation truncated to fitR_MIPS_TLS_LDM
issue.
(more info) - Fixed
ld
tool segfaults when using--gc-sections
.
(more info) - Fixed MIPS
GOT_PAGE
counting 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
.dynamic
to the data segment, so that it is writable. - Replaced hard-coded values for symbols with correct segment sizes for MIPS.
- Removed the
-mno-shared
option from the defaults in the MIPS toolchain.
The default for Android toolchain is-fPIC
(or-fpic
if supported). If you do not
explicitly specify-mshared
,-fpic
,-fPIC
,-fpie
, or-fPIE
,
the MIPS compiler adds-mno-shared
that turns off PIC. Fixed compiler not to add
-mno-shared
in this case. - Fixed wrong package names in samples
hello-jni
andtwo-libs
so that
thetests
project underneath it can compile.
- Fixed
- Other Changes:
-
- Changed locations of binaries:
- Moved
gdbserver
from
toolchain/<arch-os-ver>/prebuilt/gdbserver
to
prebuilt/android-<arch>/gdbserver/gdbserver
. - Renamed x86 toolchain prefix from
i686-android-linux-
to
i686-linux-android-
. - Moved
sources/cxx-stl/gnu-libstdc++/include
andlib
to
sources/cxx-stl/gnu-libstdc++/4.6
when compiled with GCC 4.6, or
sources/cxx-stl/gnu-libstdc++/4.4.3
when compiled with GCC 4.4.3. - Moved
libbfd.a
andlibintl.a
fromlib/
tolib32/
.
- Moved
- Added and improved various scripts in the rebuild and test NDK toolchain:
- Added
build-mingw64-toolchain.sh
to generate a new Linux-hosted toolchain
that generates Win32 and Win64 executables. - Improved speed of
download-toolchain-sources.sh
by using theclone
command and only usingcheckout
for the directories that are needed to build the NDK
toolchain binaries. - Added
build-host-gcc.sh
andbuild-host-gdb.sh
scripts. - Added
tests/check-release.sh
to check the content of a given NDK
installation directory, or an existing NDK package. - Rewrote the
tests/standalone/run.sh
standalone tests .
- Added
- Removed
if_dl.h
header from all platforms and architectures. TheAF_LINK
andsockaddr_dl
elements it describes are specific to BSD (i.e., they don’t exist
in Linux).
- Changed locations of binaries:
Android NDK, Revision 8 (May 2012)
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.html
in the NDK package.By default, code is generated for ARM-based devices. You can add
mips
to
yourAPP_ABI
definition in yourApplication.mk
file 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.mk
files 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.html
for 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 objectb
to derived classD
is
incorrectly adjusted in the opposite direction from the base class.
(Issue 28721) - Fixed an issue in which
make-standalone-toolchain.sh
fails to copy
libsupc++.*
.
- Fixed a typo in GAbi++ implementation where the result of
- Other bug fixes:
-
- Fixed
ndk-build.cmd
to ensure thatndk-build.cmd
works correctly even
if the user has redefined theSHELL
environment variable, which may be changed
when installing a variety of development tools in Windows environments.
- Fixed
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_COMMANDS
totrue
in 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.html
for 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.h
to 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
binutils
2.19 to fix debugging issues that
appeared in NDK r7 (which switched tobinutils
2.20.1). - Fixed
ndk-build
on 32-bit Linux. A packaging error put a 64-bit version
of theawk
executable underprebuilt/linux-x86/bin
in 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.cmd
from 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_shared
if you want to link against the shared library
version or-lstdc++
for the static version.See
docs/STANDALONE-TOOLCHAIN.html
for more details about this fix. - Fixed
gnustl_shared
on Cygwin. The linker complained that it couldn’t find
libsupc++.a
even 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_FEATURES
to'exceptions'
,
'rtti'
or both in yourApplication.mk
. See
docs/APPLICATION-MK.html
for more details.
- Enable exceptions and/or RTTI explicitly in your modules or
ndk-gdb
now 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_MODE
value
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
memmove
instead ofmemcpy
instring::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-features
helper library was updated to report three optional
x86 CPU features (SSSE3
,MOVBE
andPOPCNT
). See
docs/CPU-FEATURES.html
for more details. docs/NDK-BUILD.html
was updated to mentionNDK_APPLICATION_MK
instead
ofNDK_APP_APPLICATION_MK
to select a customApplication.mk
file.- Cygwin:
ndk-build
no 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
/home
to\serversubdir
instead ofC:SomeDir
.
- When the Cygwin drive prefix was not
- Cygwin:
ndk-build
does not try to use the native Windows tools under
$NDK/prebuilt/windows/bin
with 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.html
and 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.html
and
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_CCACHE
environment variable toccache
(or the path to
yourccache
binary). 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_ABI
toall
to 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.mk
are equivalent with this release:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
This also works if you define
APP_ABI
when calling
ndk-build
from 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_FEATURES
variable inAndroid.mk
that
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.html
and
docs/CPLUSPLUS-SUPPORT.html
for more details. - Shortened paths to source and object files that are used in build commands. When
invoking$NDK/ndk-build
from 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-build
from a sub-directory of your project tree, or if
you defineNDK_PROJECT_PATH
to 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.cmd
script from the command line from your project path. The
script takes exactly the same arguments as the originalndk-build
script.
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-gdb
does 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_MODULES
is not defined in
yourApplication.mk
. For example, if a top-level modulefoo
imports a modulebar
, then bothlibfoo.so
and
libbar.so
are copied to the install location. Previously, only
libfoo.so
was copied, unless you listedbar
in your
APP_MODULES
too. If you defineAPP_MODULES
explicitly, the
behavior is unchanged. ndk-gdb
now 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
modulefoo
imports static librarybar
that imports static
libraryzoo
, thelibfoo.so
will now be linked against both
libbar.a
andlibzoo.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_shared
that 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.cpp
andbar.cxx
as 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_object
GL_OES_EGL_image_external
GL_APPLE_texture_2D_limited_npot
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_lod_bias
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_env_enhanced_fixed_function
GL_IMG_user_clip_plane
GL_IMG_multisampled_render_to_texture
GL_NV_fence
GL_QCOM_driver_control
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_perfmon_global_mode
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uint
GL_OES_get_program_binary
GL_OES_mapbuffer
GL_OES_packed_depth_stencil
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_array_object
GL_OES_EGL_image_external
GL_AMD_program_binary_Z400
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_compression_dxt1
GL_IMG_program_binary
GL_IMG_read_format
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_multisampled_render_to_texture
GL_NV_coverage_sample
GL_NV_depth_nonlinear
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordable
EGL_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_handle
symbol (ARM only). - Fixed the inclusion order of
$(SYSROOT)/usr/include
for x86 builds.
See the bug for
more information. - Fixed the definitions of
ptrdiff_t
andsize_t
in
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.html
in the NDK package.By default, code is generated for ARM-based devices, but you can add x86 to your
APP_ABI
definition in yourApplication.mk
file 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.mk
files 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.html
for more details. - The new
ndk-stack
tool lets you translate stack traces in
logcat
that 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_LIBRARIES
to work
correctly with the new toolchain and added documentation for this in
docs/ANDROID-MK.html
. - Fixed a bug where code linked against
gnustl_static
crashed 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_index
parameter, 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-module
fails, it now prints the list of directories that
were searched. This is useful to check that theNDK_MODULE_PATH
definition
used by the build system is correct. - When
import-module
succeeds, 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 shell
failures and improved
error messages.<pthread.h>
: Fixed the definition of
PTHREAD_RWLOCK_INITIALIZER
for 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_NEON
was set to
true (typo inbuild/core/build-binary.mk
). - Fixed a bug that prevented the compilation of
.s
assembly files
(.S
files were okay).
- Object files are now always linked in the order they appear in
Android NDK, Revision 5b (January 2011)
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-build
issues:- 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=1
in your
environment to usecygpath -m
again. - 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_PATH
environment variable from
working properly when
it contained multiple directories separated with a colon. - The
prebuilt-common.sh
script 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_ADDRSTRLEN
was added to
<netinet/in.h>
. - Missing declarations for
IN6_IS_ADDR_MC_NODELOCAL
and
IN6_IS_ADDR_MC_GLOBAL
were added to<netinet/in6.h>
. - ‘asm’ was replaced with ‘__asm__’ in
<asm/byteorder.h>
to allow
compilation with-std=c99
.
the
Android NDK, Revision 5 (December 2010)
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
.apk
file.
- 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
cpufeatures
helper 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-plasma
and
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
Android NDK, Revision 4b (June 2010)
- 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-build
build
command. - Adds support for easy native debugging of generated machine code on production
devices through the newndk-gdb
command. - Adds a new Android-specific ABI for ARM-based CPU architectures,
armeabi-v7a
. The new ABI extends the existingarmeabi
ABI 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
cpufeatures
static 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
cpufeatures
library 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 ofBitmap
objects from native code.
- Provides a simplified build system through the new
Android NDK, Revision 3 (March 2010)
- 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.
Android NDK, Revision 2 (September 2009)
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 aGLSurfaceView
object.
Android NDK, Revision 1 (June 2009)
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 a
element in its manifest file, with an
<uses-sdk>
android:minSdkVersion
attribute 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:minSdkVersion
attribute 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:glEsVersion
attribute 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
Bitmap
pixel buffers or utilizes native activities, the application
containing the library can be deployed only to devices running Android 2.2 (API level or
higher. To ensure compatibility, make sure that your application declares<uses-sdk
attribute 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+x
on 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.bin
The 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.mk
to 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.apk
file.
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 theNativeActivity
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.
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.html
for more
information) - ARMv7-A, including Thumb-2 and VFPv3-D16 instructions, with optional support for
NEON/VFPv3-D32 instructions (seedocs/CPU-ARM-NEON.html
for more information) - x86 instructions (see
docs/CPU-X86.html
for more information) - MIPS instructions (see
docs/CPU-MIPS.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.
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
cpufeatures
static 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 aGLSurfaceView
object.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
cpufeatures
library 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 AndroidBitmap
objects 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
android
tool 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/
andres
directories, 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
android
tool 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-jni
directory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/hello-jni
directory. - 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-build
command.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/
andres
directories). The AndroidManifest.xml declares
that the application is native and specifies the .so file of the native activity. SeeNativeActivity
for the source or see the
<ndk_root>/platforms/samples/native-activity/AndroidManifest.xml
file. - A
jni/
directory contains the native activity, main.c, which uses the
android_native_app_glue.h
interface 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
android
tool 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-activity
directory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/native-activity
directory. - 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-build
command.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 |
(1 votes, average: 4.00 out of 5) Loading… |
Author |
Google
|
Last Updated On |
January 10, 2019 |
Runs on |
Windows 10 / Windows 8 / Windows 7 / Windows Vista / XP |
Total downloads |
1,729 |
License |
Free |
File size |
498,28 MB |
Filename |
android-ndk-r18b-windows-x86.zip android-ndk-r18b-windows-x86_64.zip |
@usr~
$ cd $ANDROID_SDK_ROOT1
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta4-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.A linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta4-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.B macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta4-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.C macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta4-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.D windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta3-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.E macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta3-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.F macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta3-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.G linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta3-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.H windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta2-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.I macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta2-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.J macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta2-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.K linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta2-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.L windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta1-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.M linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta1-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.N macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta1-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.O macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r23-beta1-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.P windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22b-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.Q macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22b-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.R macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22b-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.S linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22b-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.T windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.U macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.V macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.W linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.X windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-beta1-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.Y linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-beta1-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.Z macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-beta1-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AA macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r22-beta1-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AB windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21e-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AC macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21e-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AD macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21e-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AE linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21e-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AF windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21d-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AG macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21d-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AH macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21d-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AI linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21d-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AJ windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21c-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AK linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21c-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AL macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21c-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AM macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21c-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AN windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta3-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AO macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta3-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AP windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta3-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AQ macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta3-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AR linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AS windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AT macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AU macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AV linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta2-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AW linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta2-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AX macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta2-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AY macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta2-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.AZ windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta1-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BA macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta1-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BB linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21b-beta1-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BC windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BD windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BE linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BF macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-beta2-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BG macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-beta2-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BH linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r21-beta2-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BI windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20b-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BJ linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20b-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BK macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20b-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BL macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20b-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BM windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20b-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BN windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BO macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BP macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BQ linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BR windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r20-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BS windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r19c-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BT linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r19c-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BU macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r19c-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BV macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r19c-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BW windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r19c-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BX windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r18b-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BY macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r18b-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.BZ macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r18b-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CA linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r18b-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CB windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r18b-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CC windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r17c-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CD macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r17c-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CE macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r17c-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CF linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r17c-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CG windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r17c-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CH windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r16b-linux-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CI linux)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r16b-darwin-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CJ macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r16b-darwin-aarch64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CK macosx)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r16b-windows-x86.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CL windows)
@usr$ANDROID/SDK/ROOT
$ rm -rf ndk-bundle && unzip path/to/android-ndk-r16b-windows-x86_64.zip -d ndk-bundle && mv android-ndk-*/* . && rm -rf android-ndk-*(2.CM windows)
Does anyone know where I can find older versions of the Android NDK? Our code doesn’t build with r6. Surely there must be archived versions somewhere.
Alex Bitek
6,4815 gold badges46 silver badges77 bronze badges
asked Jul 27, 2011 at 19:18
8
Here are the links for Windows, Mac and Linux. Latest revision of 18.x, 17.x, 16.x, 15.x, 14.x, 13.x, 12.x, 11.x, 10.x, 9.x, 8.x and 7.x versions.
Update: Download Latest and Old NDK releases from Android official site.
Android NDK, Revision 18b (January 2019)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 17c (June 2018)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 16b (December 2017)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 15c (July 2017)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 14b (March 2017)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 13b (October 2016)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 12b (June 2016)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 11c (March 2016)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK, Revision 10e (May 2015)
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK r9d
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK r8e
Windows 32-bit | Windows 64-bit | Mac OS X 64-bit | Linux 64-bit
Android NDK r7c
Windows 32-bit | Mac OS X 64-bit | Linux 64-bit
answered Jan 22, 2015 at 11:58
Madan SapkotaMadan Sapkota
24.4k11 gold badges112 silver badges117 bronze badges
11
Looks like you can construct the link to the NDK that you want and download it from dl.google.com:
Linux example:
http://dl.google.com/android/ndk/android-ndk-r9b-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r9b-linux-x86_64.tar.bz2
OS X example:
http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86_64.tar.bz2
Windows example:
http://dl.google.com/android/ndk/android-ndk-r9b-windows.zip
Extensions up to r10b:
.tar.bz2
for linux / os x and .zip
for windows.
Since r10c the extensions have changed to:
.bin
for linux / os x and .exe
for windows
Since r11:
.zip
for linux and OS X as well, a new URL base, and no 32 bit versions for OS X and linux.
https://dl.google.com/android/repository/android-ndk-r11-linux-x86_64.zip
mstorsjo
12.8k2 gold badges38 silver badges61 bronze badges
answered Feb 2, 2012 at 20:50
Keith JohnstonKeith Johnston
2,1511 gold badge13 silver badges14 bronze badges
7
A way to find out old download links is to use internet archive tools like «Way back machine», https://archive.org/web/. You can browse older web pages versions and get the links you want.
For example, I needed to download the NDK rev 9, so I used this tool to access the NDK download page (https://developer.android.com/tools/sdk/ndk/) from March and the download link in March pointed to NDK rev 9.
Alex Bitek
6,4815 gold badges46 silver badges77 bronze badges
answered Jul 30, 2014 at 15:20
user3486832user3486832
5275 silver badges8 bronze badges
1
I came across this just now doing the same search, and found the other answers are far too specific. I also google searched for downloading android-ndk-r8
and found next to nothing. To get the correct version, I instead went here:
https://developer.android.com/ndk/downloads/index.html
And copied the link to the download I needed, and pasted it into the URL bar. There, I edited the version to reflect what I wanted (for example, I changed r8b
to r8
). Then I pressed enter, and the correct download began.
As long as the naming conventions remain the same, this should work across all versions.
Edit: This convention did change. Some older versions are now available in the archives. For even older versions, refer to the links provided by the answer above.
answered Oct 26, 2012 at 18:47
PhilPhil
35.6k23 gold badges123 silver badges164 bronze badges
3
answered Aug 5, 2014 at 20:44
RandyRandy
9359 silver badges16 bronze badges
1
Google has moved NDK releases to GitHub. Now, the Wiki page contains links to the current stable release, to available betas, and to selected older releases.
answered Jun 21, 2016 at 9:44
Alex CohnAlex Cohn
55.4k9 gold badges109 silver badges296 bronze badges
If you search Google for the version you want, you should be able to find a download link. For example, Android NDK r5b is available at http://androgeek.info/?p=296
On another note, it might be a good idea to look at why your code doesn’t compile against the latest version and fix it.
answered Aug 12, 2011 at 15:38
epochengineepochengine
2,06217 silver badges21 bronze badges
Create an account to follow your favorite communities and start taking part in conversations.
r/Unity3D
If it doesn’t exists.
Unity requires «NDK r21d 21.3.6528147»
level 2
Thx man. This is what heroes do
level 1
Latest (LTS) version is r21e.
level 1
I am facing with same problem did you get any solution
level 2
Type exact version and google and find some archieve
level 1
For everyone still wondering about this, just follow this brief video on how to download any NDK version from inside Android Studio:
Summary:
-
Open Android Studio
-
Go to Settings > Appearance and Behavior > System Settings > Android SDK
-
Click SDK Tools tab
-
Check “Show Package Details” at bottom of window
-
Choose any NDK version
level 2
Excellent, this is what I did. I don’t want to use Unity to install a whole bunch of garbage that Android Studio has already installed. So I wanted to find JUST the NDK and this worked for me, there’s the exact 21.3.65 version that Unity requires.
level 1
did you find any solution???????
level 1
I find unity in this point so stupid how they couldnt support newer version?
Is there a logical explanation to this I wonder
level 1
What is your unity version? I wanna update to NDK r21, but mine is required ndk r19 in unity 2020.3
About Community
News, Help, Resources, and Conversation. A User Showcase of the Unity Game Engine.
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.html
in the NDK package.By default, code is generated for ARM-based devices. You can add
mips
to
yourAPP_ABI
definition in yourApplication.mk
file 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.mk
files 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.html
for 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 objectb
to derived classD
is
incorrectly adjusted in the opposite direction from the base class.
(Issue 28721) - Fixed an issue in which
make-standalone-toolchain.sh
fails to copy
libsupc++.*
.
- Fixed
ndk-build.cmd
to ensure thatndk-build.cmd
works correctly even
if the user has redefined theSHELL
environment 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_COMMANDS
totrue
in 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.html
for 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.h
to 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
binutils
2.19 to fix debugging issues that
appeared in NDK r7 (which switched tobinutils
2.20.1). - Fixed
ndk-build
on 32-bit Linux. A packaging error put a 64-bit version
of theawk
executable underprebuilt/linux-x86/bin
in 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.cmd
from 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_shared
if you want to link against the shared library
version or-lstdc++
for the static version.See
docs/STANDALONE-TOOLCHAIN.html
for more details about this fix. - Fixed
gnustl_shared
on Cygwin. The linker complained that it couldn’t find
libsupc++.a
even 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_FEATURES
to'exceptions'
,
'rtti'
or both in yourApplication.mk
. See
docs/APPLICATION-MK.html
for more details.
- Enable exceptions and/or RTTI explicitly in your modules or
ndk-gdb
now 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_MODE
value
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
memmove
instead ofmemcpy
instring::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-features
helper library was updated to report three optional
x86 CPU features (SSSE3
,MOVBE
andPOPCNT
). See
docs/CPU-FEATURES.html
for more details. docs/NDK-BUILD.html
was updated to mentionNDK_APPLICATION_MK
instead
ofNDK_APP_APPLICATION_MK
to select a customApplication.mk
file.- Cygwin:
ndk-build
no 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
/home
to\serversubdir
instead ofC:SomeDir
.
- When the Cygwin drive prefix was not
- Cygwin:
ndk-build
does not try to use the native Windows tools under
$NDK/prebuilt/windows/bin
with 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.html
and 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.html
and
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_CCACHE
environment variable toccache
(or the path to
yourccache
binary). 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_ABI
toall
to 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.mk
are equivalent with this release:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
This also works if you define
APP_ABI
when calling
ndk-build
from 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_FEATURES
variable inAndroid.mk
that
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.html
and
docs/CPLUSPLUS-SUPPORT.html
for more details. - Shortened paths to source and object files that are used in build commands. When
invoking$NDK/ndk-build
from 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-build
from a sub-directory of your project tree, or if
you defineNDK_PROJECT_PATH
to 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.cmd
script from the command line from your project path. The
script takes exactly the same arguments as the originalndk-build
script.
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-gdb
does 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_MODULES
is not defined in
yourApplication.mk
. For example, if a top-level modulefoo
imports a modulebar
, then bothlibfoo.so
and
libbar.so
are copied to the install location. Previously, only
libfoo.so
was copied, unless you listedbar
in your
APP_MODULES
too. If you defineAPP_MODULES
explicitly, the
behavior is unchanged. ndk-gdb
now 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
modulefoo
imports static librarybar
that imports static
libraryzoo
, thelibfoo.so
will now be linked against both
libbar.a
andlibzoo.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_shared
that 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.cpp
andbar.cxx
as 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_object
GL_OES_EGL_image_external
GL_APPLE_texture_2D_limited_npot
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_lod_bias
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_env_enhanced_fixed_function
GL_IMG_user_clip_plane
GL_IMG_multisampled_render_to_texture
GL_NV_fence
GL_QCOM_driver_control
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_perfmon_global_mode
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uint
GL_OES_get_program_binary
GL_OES_mapbuffer
GL_OES_packed_depth_stencil
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_array_object
GL_OES_EGL_image_external
GL_AMD_program_binary_Z400
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_compression_dxt1
GL_IMG_program_binary
GL_IMG_read_format
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_multisampled_render_to_texture
GL_NV_coverage_sample
GL_NV_depth_nonlinear
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordable
EGL_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_handle
symbol (ARM only). - Fixed the inclusion order of
$(SYSROOT)/usr/include
for x86 builds.
See the bug for
more information. - Fixed the definitions of
ptrdiff_t
andsize_t
in
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.html
in the NDK package.By default, code is generated for ARM-based devices, but you can add x86 to your
APP_ABI
definition in yourApplication.mk
file 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.mk
files 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.html
for more details. - The new
ndk-stack
tool lets you translate stack traces in
logcat
that 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_LIBRARIES
to work
correctly with the new toolchain and added documentation for this in
docs/ANDROID-MK.html
. - Fixed a bug where code linked against
gnustl_static
crashed 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_index
parameter, 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-module
fails, it now prints the list of directories that
were searched. This is useful to check that theNDK_MODULE_PATH
definition
used by the build system is correct. - When
import-module
succeeds, 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 shell
failures and improved
error messages.<pthread.h>
: Fixed the definition of
PTHREAD_RWLOCK_INITIALIZER
for 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_NEON
was set to
true (typo inbuild/core/build-binary.mk
). - Fixed a bug that prevented the compilation of .s assembly files
(.S
files were okay).
- Object files are now always linked in the order they appear in
Android NDK, Revision 5b (January 2011)
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-build
issues 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=1
in your
environment to usecygpath -m
again. - 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_PATH
environment variable from working properly when
it contained multiple directories separated with a colon. - The
prebuilt-common.sh
script 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_ADDRSTRLEN
was added to<netinet/in.h>
. - Missing declarations for
IN6_IS_ADDR_MC_NODELOCAL
andIN6_IS_ADDR_MC_GLOBAL
were added to<netinet/in6.h>
. - ‘asm’ was replaced with ‘__asm__’ in
<asm/byteorder.h>
to allow compilation with-std=c99
.
Android NDK, Revision 5 (December 2010)
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
.apk
file.
- 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
cpufeatures
helper 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-plasma
andnative-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
Android NDK, Revision 4b (June 2010)
- 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-build
build
command. - Adds support for easy native debugging of generated machine code on production
devices through the newndk-gdb
command. - Adds a new Android-specific ABI for ARM-based CPU architectures,
armeabi-v7a
. The new ABI extends the existingarmeabi
ABI 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
cpufeatures
static 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
cpufeatures
library 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 ofBitmap
objects from native code.
- Provides a simplified build system through the new
Android NDK, Revision 3 (March 2010)
- 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.
Android NDK, Revision 2 (September 2009)
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 aGLSurfaceView
object.
Android NDK, Revision 1 (June 2009)
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 a
element in its manifest file, with an
<uses-sdk>
android:minSdkVersion
attribute 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:minSdkVersion
attribute 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:glEsVersion
attribute 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
Bitmap
pixel buffers or utilizes native activities, the application
containing the library can be deployed only to devices running Android 2.2 (API level or
higher. To ensure compatibility, make sure that your application declares<uses-sdk
attribute 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.mk
to 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.apk
file.
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 theNativeActivity
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.
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.html
for more
information) - ARMv7-A, including Thumb-2 and VFPv3-D16 instructions, with optional support for
NEON/VFPv3-D32 instructions (seedocs/CPU-ARM-NEON.html
for more information) - x86 instructions (see
docs/CPU-X86.html
for more information) - MIPS instructions (see
docs/CPU-MIPS.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.
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
cpufeatures
static 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 aGLSurfaceView
object.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
cpufeatures
library 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 AndroidBitmap
objects 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
android
tool 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/
andres
directories, 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
android
tool 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-jni
directory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/hello-jni
directory. - 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-build
command.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/
andres
directories). The AndroidManifest.xml declares
that the application is native and specifies the .so file of the native activity. SeeNativeActivity
for the source or see the
<ndk_root>/platforms/samples/native-activity/AndroidManifest.xml
file. - A
jni/
directory contains the native activity, main.c, which uses the
android_native_app_glue.h
interface 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
android
tool 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-activity
directory. - Click Finish.
- On the command line:
- Change to the
<ndk-root>/samples/native-activity
directory. - 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-build
command.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