Android應用程序(Java程序)運行於Dalvik虛擬機中。NDK允許應用程序的一部分使用native語言(C,C++)來實現。這對很多程序都是有幫助的,比如需要利用以前完成的C,C++代碼,也可以提高運行速度。
NDK提供以下:
1. 一組工具和編譯文件,用來將C/C++代碼生成Native庫。
2. 將Native庫嵌入應用程序包(APK)的方法。
3. 一組Native系統頭文件和庫。它們支持所有未來Android版本(從Android1.5開始)。但應用程序使用Native Activity則必須在Android2.3或更高版本使用。(因爲android.app.NativeActivity從API 9纔有)
4. 文檔,例子和指南。
最近的NDK(NDK R7C)支持的指令集如下:
1. ARMv5TE (including Thumb-1 instructions)
2. ARMv7-A (including Thumb-2 and VFPv3-D16 instructions, with optional support for NEON/VFPv3-D32 instructions)
3. x86 instructions (see CPU-ARCH-ABIS.HTML for more information)
ARMv5TE(包括Thumb-1)與ARMv7-A的主要區別是:ARMv7-A支持硬件VFP, Thumb-2 ,Neon指令。
可以編譯爲任意一種或者兩者的指令集, 缺省編譯爲ARMv5TE指令。但轉換爲 ARMv7-A 也是很容易的(
Application.mk
中修改即可)。也可以在同一時刻編譯爲雙指令集。( CPU-ARCH-ABIS.HTML
in the NDK package 中下一步察看)NDK提供libc(C庫),libm(數學庫), 3D graphics 庫的穩定頭文件等。
NDK的成分如下:
NDK包含APIs,文檔,例子程序等。
Developer Tools包含如下:
1.交叉編譯器,可以在Linux,Windows,MacOS下產生 native ARM二進制文件。
2.一組系統頭文件
- 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
NDK同時還提供一套編譯系統,以方便使用。可以不必瞭解Toolchain/CPU/Platform/ABI等細節,只是創建一個簡單的build 文件,指明哪個文件需要被編譯,以及哪個Android應用程序將要使用它,就可以編譯成功。
NDK需要GNU Make 3.81或者以上版本(make -v可以看到)。
另外:Android1.5之後,Android 2.3之前的Android版本。使用C/C++代碼,只能用JNI方式,並使用NDK編譯。
但在Android2.3 之後,因爲有了 android.app.NativeActivity 。所以可以不再利用JNI方式由Java調用C/C++代碼編譯出的庫了。
注:一些Linux下單列出來的庫,被合併到C庫中了,例如libpthread.so. 被合併入libc.so
注意:此處NDK版本爲NDK R7C.