Google's Android NDK
1.1、Google's Android NDK简介

2009/06/26Google发布了NDKNative Development Kit, 原生开发工具包)

Google's Android NDK是对Android SDK的补充,而不是替代。 也就是,我们无法使用纯粹的C/C++实现Android应用开发。

Google's Android NDK允许部分Android功能通过C/C++语言实现。

Google's Android NDK并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护,应用程序UI方面的API也没有提供。

Google's Android NDK官网:https://developer.android.google.cn/ndk

注意:这里我们限定了这个Android NDKGoogle's, 因为还有个CrystaX NDK,它对Google's Android NDK做了一些修改,某些细节与Google's Android NDK不同。

1.2、为什么需要Google's Android NDK?
  • 官方支持,开发者更放心

    Google's Android NDK的发布,使Java+C的开发方式终于转正。成为Android官方明确支持的开发方式。

    其实,从Android平台诞生起,就已经支持使用C/C++开发。

    众所周知,Android SDK Framework API基于Java平台, 这意味着基于Android SDK进行开发的第三方应用都必须使用Java平台。Java平台 支持通过JNIC/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的开发模式称之为灰色模式。

  • 提高执行效率
    我们可以将要求高性能的应用逻辑使用C/C++开发,从而提高应用程序的执行效率。
  • 代码的保护
    Java代码编译后很容易被反编译,而C/C++编译后的反汇编难度较大。我们可以将需要保密的应用逻辑使用C/C++开发。
  • 可以调用第三方C/C++库
    因为大部分的开源库是用C/C++代码编写的。
  • 便于移植
    C/C++写的库可以方便的在其他的嵌入式平台上再次使用。
1.2、通过包管理器安装Google's Android NDK
操作系统包管理器安装命令
WindowsChocolateychoco install -y android-ndk
macOSHomeBrewbrew cask install android-ndk

Arch Linux

ArcoLinux

Manjaro Linux

pacmansudo pacman -Syyu --noconfirm
sudo pacman -S    --noconfirm android-ndk

安装完成之后,还需要配置环境变量:

export ANDROID_NDK_HOME=/usr/local/opt/android-ndk
1.4、通过AndroidSDK安装Google's 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
1.5、通过下载编译好的二进制压缩包安装Google's Android NDK

step1、安装依赖

下载时cURL
解压时unzip
运行时bashGNU make

step2、使用curl命令下载编译好的Google's Android NDK二进制压缩包 (

curl -O 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
1.6、Google's Android NDK安装目录结构

进入Google's Android NDK的安装目录,如下:

docs目录:

在低版本的Google's Android NDK中存在一个docs目录, 此目录中存放的是Google's Android NDK的详细使用帮助文档。

在高版本的Google's Android NDK中把docs目录去掉了, 因为Google把这个帮助文档托管在GitHub上了。

samples目录:

在低版本的Google's Android NDK中存在一个samples目录, 此目录中存放的是Google's Android NDK的示例代码。初学者可以通过运行和查看这里的示例代码进行学习。

在高版本的Google's Android NDK中把samples目录去掉了, 因为Google把这个帮助文档托管在GitHub上了。

sources目录:

存放源码的目录。包括C++中的STL等库。

toolchains目录:

这里存放的是一些不同目标平台的交叉编译工具链

platforms目录:

这里存放的是不同的Android API版本、不同的CPU架构对应的支持的头文件和动态库。

这个目录下的内容是开发人员特别要注意的。我们开发就是靠这些头文件中声明的API的。

Android支持3CPU架构:armmpisx86。 每个平台下都有对应的头文件和实现库。

下面是某个CPU架构的头文件:

下面是某个CPU架构的实现库:

1.7、Google's Android NDK中包含的命令
1.8、Google's Android NDK中包含的头文件

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年第一次修订时引进,用于支持多字节和宽字节分类函数
POSIXpthread.h多线程支持
langinfo.h语言相关的定义
unistd.h操作系统相关的定义
sys/mman.h操作系统相关的定义
sys/stat.h操作系统相关的定义
Javajni.h
Androidandroid/api-level.hAPI Level定义
android/ndk-version.hNDK版本宏定义
android/log.hlogcat接口定义
1.9、Google's Android NDK实战