OpenHarmony的NDK开发之初探
前言
学习OpenHarmony的初衷,是为了完成在矿鸿系统下的开发工作。目前还没有矿鸿版子,而矿鸿来源于OpenHarmony,所以就先从学习OpenHarmony入手。他俩用到的技术应该是一致的,只不过矿鸿多了一层自己的协议(MDTP)规定,到时候按照他的协议开发就好了。
之前没有学习过ArkTS语言,想着核心业务代码用C/C++去写,然后程序入口用ArkTS与C/C++去交互。所以就需要研究一下NDK(Native Development Kit),这个上一篇文章末尾提到过。本节主要介绍一下简单的ArkTS与C/C++的交互,主要做记录用。
何为NDK
NDK(Native Development Kit)是OpenHarmony SDK提供的Native API、相应编译脚本和编译工具链的集合,方便开发者使用C或C++语言实现应用的关键功能。NDK只覆盖了OpenHarmony一些基础的底层能力,如C运行时基础库libc、图形库、窗口系统、多媒体、压缩库、面向ArkTS/JS与C跨语言的Node-API等,并没有提供ArkTS/JS API的完整能力。
运行态,开发者可以使用NDK中的Node-API接口,访问、创建、操作JS对象;也允许JS对象使用Native动态库。主要参考官方文档,以下内容大体是搬运官方文档,只是自己做了一些整合。
NDK适用场景
适合使用NDK的场景:应用涉及如下场景时,适合采用NDK开发
-
性能敏感的场景,如游戏、物理模拟等计算密集型场景。
-
需要复用已有C或C++库的场景。
-
需要针对CPU特性进行专项定制库的场景,如Neon加速。
不建议使用NDK的场景:应用涉及如下场景时,不建议采用NDK开发
-
纯C或C++的应用。
-
希望在尽可能多的OpenHarmony设备上保持兼容的应用。
Node-API简介
曾用名NAPI,是OpenHarmony中提供ArkTS/JS与C/C++跨语言调用的接口,是NDK接口中的一部分。该接口是在Node.js提供的Node-API基础上扩展而来,但与Node.js中的Node-API不完全兼容。它提供了一组稳定的、跨平台的API,可以在不同的操作系统上使用。本文中如无特别说明,后续均使用Node-API指代OpenHarmony Node-API能力
NDK常用模块
下表介绍了NDK的常用模块。
| 模块 | 模块简介 |
|---|---|
| 标准C库 | 以musl为基础提供的标准C库接口。 |
| 标准C++库 | C++运行时库libc++_shared。 |
| 日志 | 打印日志到系统的HiLog接口。 |
| Node-API | 当需要实现ArkTS/JS和C/C++之间的交互时,可以使用Node-API。 |
| FFRT | 基于任务的并发编程框架。 |
| libuv | 三方异步IO库。 |
| zlib | zlib库,提供基本的数据压缩、解压接口。 |
| Rawfile | 应用资源访问接口,可以读取应用中打包的各种资源。 |
| XComponent | ArkUI XComponent组件提供surface与触屏事件等接口,方便开发者开发高性能图形应用。 |
| Drawing | 系统提供的2D图形库,可以在surface进行绘制。 |
| OpenGL | 系统提供的OpenGL 3D图形接口。 |
| OpenSL ES | 用于2D、3D音频加速的接口库。 |
创建NDK工程
下面通过DevEco Studio的NDK工程模板,来演示如何创建一个NDK工程。
说明:
不同DevEco Studio版本的向导界面、模板默认参数等会有所不同,请根据实际工程需要,创建工程或修改工程参
-
通过如下两种方式,打开工程创建向导界面。
- 如果当前未打开任何工程,可以在DevEco Studio的欢迎页,选择Create Project开始创建一个新NDK工程。
- 如果已经打开了工程,可以在菜单栏选择File > New > Create Project来创建一个新NDK工程。

2.根据工程创建向导,选择Native C++工程模板,然后单击Next。

3.点击“finish”


说明:
此时创建的是HarmonyOS的工程,如果想要换到OpenHarmony工程,还需要有几部操作,但是由于OpenHarmony没有模拟机,所以我们暂时用HarmonyOS学习,这个其实不影响,通过官方文档(OpenHarmony和HarmonyOS)可以看出,他两个的关于这部的介绍基本一致。
核心编译过程如下:
-
根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMake命令并执行CMake。
-
执行Ninja,按照makefile执行编译和链接,将生成的.so以及运行时依赖的.so同步到输出目录,完成构建过程。
CMakeLists.txt

build-profile.json5
红色画框部分需要加上即可,这样就可以用模拟器去执行了,要不然会报错,后期不管是OpenHarmony还是HarmonyOS得真机,也都需要修改,并且如果是OpenHarmony得真机得系统,则还需要修改如下(上一篇提到得):
在工程级build-profile.json5文件添加compileSdkVersion字段。
将compatibleSdkVersion和compileSdkVersion字段赋值为整数类型。DevEco Studio 6.0.0 Beta1版本及以上工程中,compatibleSdkVersion、compileSdkVersion、targetSdkVersion(若有)字段赋值要求为字符串类型。
将runtimeOS从"HarmonyOS"修改为"OpenHarmony"。

打开模拟机

修改一下代码

点击运行
点击Hello World,一直点击,就出现了如图所示,说明调用成功了

写一篇介绍各部分得代码,这篇就这样。
更多推荐
所有评论(0)