| 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. |