Android NDK 简介(Android NDK 教程 一)
这是 Android NDK 开发的第一篇文章,内容当然都是一些简单的概念性的问题。但是像 SDK 安装,环境变量配置什么的,也都是大家应该懂的内容,这里就不在赘述了。后面将会对 Android NDK 开发中涉及到的一些知识进行讲解。
Android 上的 C++ 简介
在介绍 Android NDK 之前,咱们先了解几个名词,这些名词将会是贯穿在 Android 开发过程中的,也很非常简单:
- Android 软件开发包 Android Software Development Kit, SDK
- Android 原生开发包 Android Native Development Kit,NDK
- Java 开发包 Java Development Kit,JDK
- GNU Make 构建系统
另外,我们来先了解以下 JNI 和 NDK ,以及它们与 Android 原生开发有什么关系。这里先有一个概念即可,后面将进行详细的阐述。
JNI 是 Java 语言提供的 Java 和 C/C++ 相互沟通的机制,Java 可以通过 JNI 调用本地的 C/C++ 代码,本地 的 C/C++ 的代码也可以调用 Java 代码。JNI 是本地编程接口,Java 和 C/C++ 互相通过的接口。Java 通过 C/C++ 使用本地的代码的一个关键性原因在于 C/C++ 代码的高效性。 代码和其他语言写的代码进行交互。
NDK 是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发 C(或C++)的动态库,并能自动将 s o 和 Java 应用一起打包成 apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU、平台、ABI 等差异,开发人员只需要简单修改 mk 文件(指出“哪些文件需要编译”、“编译特 性要求”等),就可以创建出 so。它可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工 作。
NDK 是什么
Android NDK 是 Android 软件开发包 SDK 的相关工具集,用来扩展 Android SDK 的功能,从而使开发人员能够使用机器代码生成的编程语言(如C、C++和汇编语言)实现一些对代码性能要求较高的模块并将这些模块嵌入到 Android 应用程序中。
NDK 提供的组件
Android NDK 不是一个单独的工具:它是一个包含 API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集。
以下是 Android NDK 的一些主要组建:
- ARM、x86 和 MIPS 交叉编译器
- 构建系统
- Java 原生接口头文件
- C 库
- Math 库
- POSIX 线程
- 最小的 C++ 库
- ZLib 压缩库
- 动态链接库
- Android 日志库
- Android 像素缓冲区库
- Android 原生应用 APIs
- OpenGL ES 3D 图形库
- OpenSL ES 原生音频库
- OpenMax AL 最小支持
- Vulkan
NDK 的目录结构
- ndk-build 该 shell 脚本是 Android NDK 构建系统的起点
- ndk-gdb 该 shell 脚本允许用 GNU 调试器调试原生组建
- ndk-stack 该 shell 脚本可以帮助分析原生组建崩溃时的堆栈追踪
- build 该目录包含了 Android NDK 构建系统的所有模块
- platforms 该目录包含了支持不同 Android 目标版本的头文件和库文件。Android NDK 构建系统会根据具体的 Android 版本自动引用这些文档
- samples 该目录包含了一些示例程序,但是在最新的 NDK 版本中已经没有这个文件夹了
- sources 该目录包含了可供开发人员导入到现有的 Android NDK 项目的一些共享模块
- toolchains 该目录包含目前 Android NDK 支持的不同目标机体系结构的交叉编译器。Android NDK 目前支持 ARM、x86 和 MIPS 机体系结构。 Android NDK 构建系统根据选定的体系结构使用不同的交叉编译器。
Android NDK 最重要的组件就是它的构建系统,它包含了所有的其他组件。
NDK 构建系统所提供的功能
- 建立一个共享库
- 建立多个共享库
- 建立静态库
- 利用共享库共享通用模块
- 在多种 NDK 项目间共享模块
- 使用预建库
- 建立独立的可执行文件
- 其他构建系统变量和宏
- 定义新变量和条件操作