short for | : | Native Development Kit |
是什么 ? | : | a toolset that lets you implement parts of your Android app in native code, using languages such as C and C++. For certain types of apps, this can help you reuse code libraries written in those languages. |
开发语言 | : | C、C++、Bash |
官方主页 | : | https://developer.android.google.cn/ndk |
源码仓库 | : | https://github.com/android/ndk |
同类软件 | : | CrystaX NDK |
Google's Android NDK
的发布,使Java+C的开发方式终于转正。成为Android
官方明确支持的开发方式。
其实,从Android
平台诞生起,就已经支持使用C/C++开发。
众所周知,Android SDK Framework API
基于Java平台, 这意味着基于Android SDK进行开发的第三方应用都必须使用Java平台。Java平台 支持通过JNI与C/C++互操作。
在Android SDK首次发布时,Google
就宣称其Android虚拟机-Dalvik支持JNI, 也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,Java+C的编程方式是一直都可以实现的。 只是在Android SDK文档里找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发, 但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。官方并没有给出确切的规范。 所以,在Google's Android NDK
出来之前, 我们将Java+C的开发模式称之为灰色模式。
操作系统 | 包管理器 | 安装命令 |
---|---|---|
Windows | Chocolatey | choco install -y android-ndk |
macOS | HomeBrew | brew install android-ndk |
pacman | sudo pacman -Syyu --noconfirm |
安装完成之后,还需要配置环境变量:
export ANDROID_NDK_HOME=/usr/local/opt/android-ndk
AndroidSDK中的sdkmanager命令可以下载Google's Android NDK
:
sdkmanager "ndk-bundle"
下载到的目录是$ANDROID_HOME/ndk-bundle
,将它加入PATH
环境变量中:
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle
export PATH=$ANDROID_NDK_HOME:$PATH
step1、安装依赖
所有时 | Terminal + Shell + GNU CoreUtils |
下载时 | cURL |
解压时 | unzip |
运行时 | bash、gmake |
step2、使用curl命令下载编译好的Google's Android NDK
二进制压缩包 ()
curl -LO https://dl.google.com/android/repository/android-ndk-r14b-darwin-x86_64.zip
step3、使用unzip解压Android NDK
压缩包
unzip android-ndk-r14b-darwin-x86_64.zip -d ~/bin
step4、配置环境变量
export ANDROID_NDK_HOME=~/bin/android-ndk-r14b
export PATH=$PATH:$ANDROID_NDK_HOME
进入Google's Android NDK
的安装目录,如下:
在低版本的Google's Android NDK
中存在一个docs
目录, 此目录中存放的是Google's Android NDK
的详细使用帮助文档。
在高版本的Google's Android NDK
中把docs
目录去掉了, 因为Google
把这个帮助文档托管在GitHub上了。
在低版本的Google's Android NDK
中存在一个samples
目录, 此目录中存放的是Google's Android NDK
的示例代码。初学者可以通过运行和查看这里的示例代码进行学习。
在高版本的Google's Android NDK
中把samples
目录去掉了, 因为Google
把这个帮助文档托管在GitHub上了。
存放源码的目录。包括C++中的STL
等库。
这里存放的是一些不同目标平台的交叉编译工具链
。
这里存放的是不同的Android API
版本、不同的CPU
架构对应的支持的头文件和动态库。
这个目录下的内容是开发人员特别要注意的。我们开发就是靠这些头文件中声明的API的。
Android
支持3
种CPU
架构:arm
、mpis
、x86
。 每个平台下都有对应的头文件和实现库。
下面是某个CPU
架构的头文件:
下面是某个CPU
架构的实现库:
Google's Android NDK
支持的头文件在${ANDROID_NDK_HOME}/sysroot/usr/include
目录中。
Since | 头文件 | 说明 |
---|---|---|
15个 | limits.h | 定义各种极限值 |
float.h | 浮点数相关定义 | |
math.h | 定义数学常量和函数 | |
ctype.h | 定义字符处理的函数 | |
string.h | 定义字符串处理的函数 | |
stdlib.h | 常用的常量和函数定义 | |
stdio.h | 文件操作函数的定义 | |
stddef.h | 定义常用常数 | |
stdarg.h | 支持可变长度的参数列表 | |
time.h | 定义日期和时间处理函数 | |
locale.h | 定义本地化处理函数 | |
errno.h | 定义错误常量和函数 | |
assert.h | 断言相关的定义 | |
signal.h | 定义信号值 | |
setjmp.h | 定义非局部跳转 | |
9个 | complex.h | 支持复杂算法 |
fenv.h | 给出对浮点状态标记和浮点环境的其他方面的访问 | |
inttypes.h | 定义标准的、可移植的整型类型集合,也支持处理最大宽度整数的函数 | |
iso646.h | 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏 | |
stdbool.h | 定义宏bool ,以便与C++ 兼容 | |
stdint.h | 定义标准的、可移植的整型类型集合,该文件包含在inttypes.h中 | |
tgmath.h | 定义一般类型的浮点宏 | |
wchar.h | 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数 | |
wctype.h | 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数 | |
POSIX | pthread.h | 多线程支持 |
langinfo.h | 语言相关的定义 | |
unistd.h | 操作系统相关的定义 | |
sys/mman.h | 操作系统相关的定义 | |
sys/stat.h | 操作系统相关的定义 | |
Java | jni.h | |
Android | android/api-level.h | API Level 的宏 定义 |
android/ndk-version.h | NDK 版本宏定义 | |
android/log.h | logcat 接口定义 |