blob: 136c4cafe5260786cb0443ae4b74cde5fabdbee2 [file] [log] [blame] [view]
Android Native Development Kit (NDK)
====================================
The latest version of this document is available at
https://android.googlesource.com/platform/ndk/+/master/README.md.
**Note:** This document is for developers _of_ the NDK, not developers that use
the NDK.
The NDK allows Android application developers to include native code in their
Android application packages, compiled as JNI shared libraries.
[TOC]
Other Resources
---------------
* User documentation is available on the [Android Developer website].
* Discussions related to the Android NDK happen on the [android-ndk Google
Group].
* Announcements such as releases are posted to the [android-ndk-announce Google
Group].
* File bugs against the NDK at https://github.com/android-ndk/ndk/issues.
[Android Developer website]: https://developer.android.com/ndk/index.html
[android-ndk Google Group]: http://groups.google.com/group/android-ndk
[android-ndk-announce Google Group]: http://groups.google.com/group/android-ndk-announce
Building the NDK
================
Both Linux and Windows NDKs are built on Linux machines. Windows host binaries
are cross-compiled with MinGW.
Building the NDK for Mac OS X requires at least 10.8.
Components
----------
The NDK components can be loosely grouped into host toolchains, target
prebuilts, build systems, and support libraries.
### Host Toolchains
* `toolchains/` contains GCC and Clang toolchains.
* `$TOOLCHAIN/config.mk` contains ARCH and ABIS this toolchain can handle.
* `$TOOLCHAIN/setup.mk` contains toolchain-specific default CFLAGS/LDFLAGS
when this toolchain is used.
* `prebuilt/$HOST_TAG` contains build dependencies and additional tools.
* make, python, yasm, and for Windows: cmp.exe and echo.exe
* `ndk-depends`, `ndk-stack` and `ndk-gdb` can also be found here.
### Target Prebuilts
* `sysroot/usr/include` contains the headers for the NDK. See [Unified Headers]
for more information.
* `platforms/android-$VERSION/arch-$ARCH_NAME/` contains stub shared libraries
and a few static libraries for each API level. See [Platform APIs] for more
information.
* `sources/cxx-stl/$STL` contains the headers and libraries for the various C++
STLs.
* `prebuilt/android-$ARCH/gdbserver` contains gdbserver.
[Unified Headers]: docs/UnifiedHeaders.md
[Platform APIs]: docs/PlatformApis.md
### Build Systems
* `build/` contains ndk-build, the NDK's home grown build system. Most of the
implementation lives in `build/core`.
* `build/cmake` contains components for using the NDK with CMake (at present
only a CMake toolchain file, but in the future it will contain CMake modules
that CMake will load, obviating the need for a toolchain file).
* `build/tools` contains `make_standalone_toolchain.py`, but also contains
legacy sripts that were used to build the NDK. Eventually, this should contain
nothing but the standalone toolchain scripts.
* The gradle plugins for the NDK are not included in the NDK.
### Support Libraries
* `sources/android` and `sources/third_party` contain modules that can be used
in apps (gtest, cpufeatures, native\_app\_glue, etc) via
`$(call import-module,$MODULE)`.
Prerequisites
-------------
* [AOSP NDK Repository](http://source.android.com/source/downloading.html)
* Check out the branch `master-ndk`
```bash
repo init -u https://android.googlesource.com/platform/manifest \
-b master-ndk
# Googlers, use
repo init -u \
persistent-https://android.git.corp.google.com/platform/manifest \
-b master-ndk
```
Linux dependencies are listed in the [Dockerfile]. You can use docker to build
the NDK:
```bash
docker build -t ndk-dev infra/docker
docker run -it -u $UID -v `realpath ..`:/src -w /src/ndk ndk-dev ./checkbuild.py
```
Building on Mac OS X has similar dependencies as Linux, but also requires Xcode.
Running tests requires that `adb` is in your `PATH`. This is provided as part of
the [Android SDK].
[Dockerfile]: infra/docker/Dockerfile
[Android SDK]: https://developer.android.com/studio/index.html#downloads
Building the NDK
----------------
### For Linux or Darwin:
```bash
$ python checkbuild.py
```
### For Windows, from Linux:
```bash
$ python checkbuild.py --system windows # Or windows64.
```
`checkbuild.py` will also build all of the NDK tests. This takes about four
times as long as building the NDK itself, so pass `--no-build-tests` to skip
building the tests. They can be built later with `python run_tests.py
--rebuild`.
`checkbuild.py` also accepts a variety of other options to speed up local
builds, namely `--arch` and `--module`.
Packaging
---------
By default, `checkbuild.py` will also package the NDK. To skip the packaging
step, use the `--no-package` flag. To avoid packaging an incomplete NDK,
packaging will not be run if `--module` was passed unless `--force-package` was
also provided.