
NDK(Native Development Kit)允许使用C或C++语言实现应用的关键功能。当遇到性能敏感场景或需要复用已有C/C++库时,NDK是必不可少的工具。
一、NDK
NDK(Native Development Kit)是HarmonyOS SDK提供的Native API、相应编译脚本和编译工具链的集合,方便开发者使用C或C++语言实现应用的关键功能。
NDK只覆盖了HarmonyOS一些基础的底层能力:
| 能力 | 说明 |
|---|---|
| C运行时基础库 | libc |
| 图形库 | Drawing、OpenGL |
| 窗口系统 | XComponent |
| 多媒体 | 音视频处理 |
| 压缩库 | zlib |
| 跨语言调用 | Node-API(ArkTS/JS ↔ C) |
注意:NDK没有提供ArkTS/JS API的完整能力。
运行机制
-
可以使用NDK中的Node-API接口,访问、创建、操作JS对象
-
也允许JS对象使用Native动态库
二、NDK适用场景
2.1 适合使用NDK的场景
| 场景 | 说明 |
|---|---|
| 性能敏感场景 | 游戏、物理模拟等计算密集型场景 |
| 复用已有C/C++库 | 需要复用现有C/C++代码库 |
| CPU特性专项定制 | 如Neon加速等针对特定CPU特性的优化 |
2.2 不建议使用NDK的场景
| 场景 | 说明 |
|---|---|
| 纯C/C++应用 | 纯C或C++的应用不适合NDK |
| 兼容性要求高 | 希望在尽可能多的HarmonyOS设备上保持兼容的应用 |
三、香关基础
| 前置知识 | 说明 |
|---|---|
| Linux C编程 | 内核、libc基础库基于POSIX等标准扩展,掌握Linux C编程有助于理解NDK开发 |
| CMake使用 | HarmonyOS默认支持的构建系统 |
| Node Addons开发 | Node-API是跨语言调用接口,熟悉Node Addons开发模式有助于理解 |
| Clang/LLVM编译器 | 帮助编译出更优的Native动态库 |
说明:
Node-API (曾用名NAPI)是HarmonyOS中提供ArkTS/JS与C/C++跨语言调用的接口,该接口基于Node.js的Node-API扩展而来,但不完全兼容。
四、NDK目录结构
4.1 build目录
放置预定义的toolchain脚本文件hmos.toolchain.cmake。
CMake编译时需要读取该文件中的默认值(如编译器架构、C++库链接方式等),因此编译时会通过CMAKE_TOOLCHAIN_FILE指出该文件的路径。
4.2 build-tools文件夹
放置NDK提供的编译工具:
# 查看CMake版本
cmake -version
# cmake version 3.16.5
4.3 llvm文件夹
放置NDK提供的编译器工具链。
五、NDK常用模块
| 模块 | 功能简介 |
|---|---|
| 标准C库 | 基于musl提供的标准C库接口 |
| 标准C++库 | C++运行时库接口,提供C++运行时能力 |
| 日志 | 提供向系统输出HiLog日志接口 |
| Node-API | 支持ArkTS/JS和C/C++之间的交互接口 |
| FFRT | 基于任务的并发编程框架 |
| libuv | 第三方异步IO库 |
| zlib | 提供基础数据压缩与解压功能 |
| Rawfile | 提供访问应用内置资源的接口,用于读取应用中打包的各种资源 |
| XComponent | ArkUI XComponent组件,提供surface与触屏事件等接口,便于开发高性能图形应用 |
| Drawing | 系统提供的2D图形库,支持在surface进行绘制 |
| OpenGL | 系统提供的OpenGL 3D图形接口 |
| OpenSL ES | 支持2D、3D音频加速的接口 |
六、其他
| 要点 | 说明 |
|---|---|
| NDK定位 | 使用C/C++实现应用关键功能,覆盖底层能力 |
| 适用场景 | 性能敏感、复用已有库、CPU特性定制 |
| 构建工具 | CMake(默认支持) |
| 跨语言调用 | Node-API(基于Node.js扩展,但不完全兼容) |