blob: 4da9b483082dbde93c094cdaf3b98c5446ef9404 [file] [log] [blame] [view]
Unified Headers
===============
[Issue #120](https://github.com/android-ndk/ndk/issues/120)
Before NDK r14, we had a set of libc headers for each API version. In many cases
these headers were incorrect. Many exposed APIs that didn't exist, and others
didn't expose APIs that did.
In NDK r14 (as an opt in feature) we unified these into a single set of headers,
called unified headers. This single header path is used for *every* platform
level. API level guards are handled with `#ifdef`. These headers can be found in
[prebuilts/ndk/headers].
Unified headers are built directly from the Android platform, so they are up to
date and correct (or at the very least, any bugs in the NDK headers will also be
a bug in the platform headers, which means we're much more likely to find them).
In r15 unified headers are used by default. In r16, the old headers have been
removed.
[prebuilts/ndk/headers]: https://android.googlesource.com/platform/prebuilts/ndk/+/dev/platform/sysroot/usr/include
Known Issues
------------
* Standalone toolchains using GCC are not supported out of the box. To use GCC,
pass `-D__ANDROID_API__=$API` when compiling. Note: this is not something we
will be fixing.
Supporting Unified Headers in Your Build System
-----------------------------------------------
App developers can stop reading here. The following information is only
relevant to build system engineers.
Unified headers require only a few changes compared to using the deprecated NDK
headers. For reference, this patch added support to ndk-build:
https://android-review.googlesource.com/c/239934/
1. The compile time sysroot is now `$NDK/sysroot`. Previously this was
`$NDK/platforms/android-$API/arch-$ARCH`.
2. Pass `-isystem $NDK/sysroot/usr/include/$TRIPLE` when compiling. The triple
has the following mapping:
Arch | Triple
--------|-------------------------
ARM | `arm-linux-androideabi`
ARM64 | `aarch64-linux-android`
MIPS | `mipsel-linux-android`
MIPS64 | `mips64el-linux-android`
x86 | `i686-linux-android`
x86\_64 | `x86_64-linux-android`
This is needed for architecture specific headers such as those in `asm/` and
`machine/`. We plan to teach Clang's driver to automatically search the
architecture specific include directory, but that has yet to be done.
3. Pass `-D__ANDROID_API__=$API` when compiling. This define used to be provided
by `<android/api-level.h>`, but with only one set of headers this is no
longer possible. In the future we will look in to adding `-mandroid-version`
or similar to Clang so this is automatic.
4. At link time, change nothing. All link time build behavior should match the
deprecated headers behavior. `--sysroot` should still point to
`$NDK/platforms/android-$API/arch-$ARCH/`.