【鸿蒙开发】OpenHarmony与HarmonyOS调用C/C++教程

一.概述

ArkTs应用开发时,涉及到性能敏感场景、需要复用已有的C/C++库的场景以及需要针对CPU特性进行专项定制库的开发时,通常都需要调用C/C++,鸿蒙给出的解决方案有两个:通过第三方模块NAPI或者AKI来实现ArkTs调用C/C++编译出来的库,根据OpenHarmony与HarmonyOS的不同调用使用的方法也有差异,总体架构如下:

下面将分别介绍NAPI和AKI调用C/C++库的方法。

二.(NAPI方法)HarmonyOS实现ArkTS跨语言调用C/C++

ArkTS和C++之间的交互流程,主要分为以下两步:

|-----------------------------------------------------------------------------------------------------------------------------|
| 初始化阶段:当ArkTS侧在import一个Native模块时,ArkTS引擎会调用ModuleManager加载模块对应的so及其依赖。首次加载时会触发模块的register,将模块定义的方法属性挂载到exports对象上并返回该对象。 |
| 调用阶段:当ArkTS侧通过上述import返回的对象调用方法时,ArkTS引擎会找到并调用对应的C/C++方法。 |

交互流程如下:

首先是创建Native C++工程,在DevEco Studio中New > Create Project,选择Native C++模板,点击Next,选择API版本,设置好工程名称,点击Finish,新建项目选择"Native C++":

进行一些简单的配置,不知道怎么选就全部按照默认配置:

基本的工程结构如下:

在项目路径:\entry\src\main\cpp\napi_init.cpp下用C++写的demo函数add:

接着是NAPI初始化函数:

再来是构造器和注册器:

在路径:/ entry/src/main/cpp/types/libentry/oh-package.json5中将index.d.ts与cpp文件关联起来:

在路径:/ entry/src/main/cpp/types/libentry/ Index.d.ts中记录导出的接口函数(作用类似头文件):

在路径:/ entry/src/main/cpp/types/CamkeList.txt中配置Cmake打包参数:

介绍完NAPI侧,我们在介绍ArkTs侧调用C++接口的方法,在路径:/ entry/src/main/ets/pages/Index.ets下通过import引入Native侧包含处理逻辑的so来使用C/C++的方法:

三.(AKI方法)HarmonyOS实现ArkTS跨语言调用C/C++

AKI针对HarmonyOS上提供ArkTS与C/C++跨语言互调的场景提供解决方案,提供了极简语法糖使用方式,一行代码完成ArkTS与C/C++的无障碍跨语言互调,所见即所得。同时开发者无需关心Node-API的线程安全问题、Native对象GC问题,为开发者屏蔽Node-API内部复杂逻辑。

首先需要安装OHPM HAR包依赖,在指定路径下(例如:项目根路径/entry),输入以下命令安装ohpm har包依赖。

在CMakeLists.txt中添加依赖,假设编译的动态库名为libentry.so

在napi_init.cpp文件中定义业务,并将业务接口导出给 ArkTS:

注:注册的AKI插件名需与模块级 oh-package.json5 文件中 dependencies 标签下的 "lib<AKI插件名>" 字段名称一致。例如,libentry.so

在"src/main/cpp/types/libentry/index.d.ts"中导出 .so 文件的接口:

在ArkTS文件中调用.so文件中的接口:

四.HarmonyOS转换OpenHarmony的教程

由于鸿蒙编译器新建项目默认是HarmonyOS工程,如果想要从HarmonyOS转换成OpenHarmony,请执行以下操作:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 第一步:请在工程级 build-profile.json5 文件添加compileSdkVersion字段。 |
| 第二步:将compatibleSdkVersion、compileSdkVersion、targetSdkVersion(若有)字段赋值为对应的SDK版本号数值类型。 |
| 第三步:将runtimeOS从"HarmonyOS"修改为**"OpenHarmony"** |
| 第四步:单击Sync Now进行同步。在Sync Check弹窗中点击Yes,同意将module.json5/config.json文件中的phone切换为OpenHarmony支持的default类型,并删除在OpenHarmony不适用的其他设备类型,同步成功无其他报错则工程创建完成。 |
| 第五步:在Native模块的build-profile.json5文件buildOption/externalNativeOptions字段下,新增abiFilters字段并赋值为"armeabi-v7a"。(注: HarmonyOS 不支持该架构,仅OpenHarmony 支持 |
| 最后:重新同步既可。 |

相关推荐
tyqtyq2244 分钟前
营养餐单规划:AI 科学饮食规划系统的鸿蒙实现
人工智能·学习·华为·职场和发展·生活·harmonyos
不才难以繁此生1 小时前
HarmonyOS RDB 索引实战:中式美食搜索和购物清单查询怎么避免扫全表
harmonyos·arkts·arkui·rdb·中式美食·relationalstore
星释1 小时前
鸿蒙智能体开发实战:26.Skill 与插件协同开发
microsoft·华为·ai·harmonyos·鸿蒙·智能体
星释2 小时前
鸿蒙智能体开发实战:32.鸿蒙壁纸大师 - API认证与会话管理
华为·ai·harmonyos·智能体
花开彼岸天~2 小时前
鸿蒙实战:导航栏与顶部栏设计规范 HmTitleBar
华为·harmonyos·鸿蒙系统·设计规范
星释2 小时前
鸿蒙智能体开发实战:33.鸿蒙壁纸大师 - 多轮交互工作流设计
华为·交互·harmonyos·鸿蒙
●VON3 小时前
HarmonyKit | 鸿蒙新特性:router 导航 API 从 pushUrl 到 UIContext 的演进
算法·华为·交互·harmonyos
星释3 小时前
鸿蒙智能体开发实战:31.鸿蒙壁纸大师 - 环境搭建与基础配置
算法·华为·ai·harmonyos·鸿蒙
Helen_cai3 小时前
OpenHarmony 相册图片选择封装全场景开发(API Version23 + 适配版)
华为·harmonyos
特立独行的猫a3 小时前
鸿蒙PC开源软件迁移与多语言三方库移植实战课程讲稿(三、命令行工具移植实战——以OpenSSH为主线)
华为·harmonyos·三方库移植·鸿蒙pc