本文来自NDK官方文档整理而来.
NDK是一组使您能将C或C++嵌入到Android应用中的工具,能够在Android应用中使用原生代码实现逻辑操作的一整套工具,它的使用有如下显著特性:
- 在平台之间移植其应用
- 重复使用现有库,或者提供其自己的库重复使用
- 在某些情况下提高性能,特别是像游戏这种计算密集型应用
工作原理
这里主要介绍和了解一些Android NDK需要了解的组件和Android NDK的工作流程.
主要组件
在使用Android NDK开发工具包之前,你可能需要了解下有关NDK中的相关组件概念。
- 原生共享库(即共享库):NDK从C/C++源代码编译这些库或.so文件(其变现形式为.so文件)
- 原生静态库(即静态库):NDK也可编译静态库或.a文件,而我们也可将静态库关联到其他库
- Java原生接口(JNI):JNI是Java与C/C++进行交互通信的一套标准通信接口
- 应用二级制接口(ABI):ABI 可以非常精确地定义应用的机器代码在运行时应该如何与系统交互。NDK 根据这些定义编译 .so 文件。不同的 ABI 对应不同的架构:NDK 为 32 位 ARM、AArch64、x86 及 x86-64 提供 ABI 支持.
- 清单:如果您编写的应用不包含 Java 组件,则必须在清单中声明 NativeActivity 类.
工作流程
开发Android原生应用的一般流程如下:
- 设计应用,确定要以 Java 实现的部分,以及要以原生代码形式实现的部分(虽然可以完全避免 Java,但您可能发现,Android Java 框架对于控制显示和界面等任务很有用)
- 创建Android应用
- 如果要编写纯原生应用,请在 AndroidManifest.xml 中声明 NativeActivity 类。
- 在“JNI”目录中创建一个描述原生库的 Android.mk 文件,包括名称、标记、关联库和要编译的源文件。
- 或者,也可以创建一个配置目标 ABI、工具链、发布/调试模式和 STL 的 Application.mk 文件。对于其中任何您未指明的项,将分别使用以下默认值:
* ABI:所有非弃用的 ABI
* 工具链:Clang
* 模式:发布
* STL:系统
- 原生源代码放在项目的 jni 目录下。
- 使用 ndk-build 编译原生(.so、.a)库
- 编译 Java 组件,生成可执行 .dex 文件
- 将所有内容封装到一个 APK 文件中,包括 .so、.dex 以及应用运行所需的其他文件