简介
ArkTS跨语言交互官方指南除了支持使用ArkTS开发外,开发者还可以通过Node-API实现ArkTS与C/C++(Native)的跨语言交互能力。参考ArkTS跨语言交互官方指南、NDK开发(包括NDK开发导读、创建NDK工程、构建NDK工程、代码开发、调试和性能分析、硬件兼容性)。
HarmonyOS的Node-API是基于Node.js社区版本的扩展实现,但与原生Node-API并不完全兼容。
开发者可参考使用Node-API进行跨语言开发流程,基于Node-API支持的数据类型和接口进行Native能力的开发和封装,并通过在ArkTS侧导入Native模块的方式实现跨语言调用。
Node-API扩展能力接口提供了增强功能,支持更灵活的ArkTS交互和自定义对象创建。开发者可结合Node-API的扩展能力进行功能扩展,并参考Node-API开发规范和Node-API常见问题进行跨语言功能开发。
ArkTS调用C++
下面整理两种调用C++的方式,流程如下:
一、生成har包供外部module调用
参考使用Node-API实现跨语言交互开发流程
1、创建Native C++类型module
2、CMakeLists.txt配置
默认的CMakeLists.txt脚本中添加了编译所需的源代码、头文件以及三方库,开发者可根据实际工程添加自定义编译参数、函数声明、简单的逻辑控制等。核心代码说明如下:
add_library(entry SHARED napi_init.cpp) # 生成动态库
target_link_libraries(entry PUBLIC libace_napi.z.so) # 链接NAPI库
参考:native工程实现流程举例、native工程举例、Native工程举例
3、build-profile.json5
模块级build-profile.json5文件中externalNativeOptions参数配置NDK工程C/C++文件编译参数,可以通过path指定CMake脚本路径、arguments配置CMake参数、cppFlags配置C++编译器参数、abiFilters配置编译架构等。举例如下:
"externalNativeOptions": {
"path": "./src/main/cpp/test/CMakeLists.txt",
"arguments": "",
"cppFlags": "",
"abiFilters": [
"arm64-v8a",
"x86_64"
]
}
4、oh-package.json5
文件配置依赖将index.d.ts与cpp文件关联起来。
5、napi_init.cpp
1)、设置模块信息;2)、模块初始化;注意这个文件可以自定义为想要的name。
本文件的设置步骤如下(参考:native工程实现流程举例):
1)、本文件中对外方法的大致流程:调用napi_XXX方法从ArkTS获取参数,然后调用C++方法,然后将结果通过napi_XXX返回给ArkTS。比如napi_get_cb_info 用于在Native(C/C++)代码中,获取从ArkTS(或JavaScript)侧调用时传入的参数、this 对象等信息
2)、通过napi_define_properties对外导出 上一步 中实现的方法。如napi_define_properties(env, exports, sizeof(desc)/sizeof(desc[0]), desc);
3)、通过napi_module_register方法将导出的模块完成注册
6、index.d.ts
文件中声明提供给TS侧的方法。
7. ArkTs调用C/C++模块的方法
在oh-package.json5文件中通过dependencies配置依赖库
在ets文件从so中导入C/C++的方法,如import { getRandomTestData, yyy } from 'libxxx.so';
二、将代码植入其他现有module中使用
Native C++类型module中,TS可以调用native代码,因此其他module中也可以直接调用。步骤如下:
1、按照“生成har包供外部module调用”模块步骤创建Native C++类型module,name=test。C++代码创建了test目录存放,原因:为了支持多个so模块,如果是只有一个可以直接放到src/main/cpp下,无需分子目录。
2、在现有xxx模块的src/main目录下新建一个cpp的目录,然后将步骤1中native module中test目录下的cpp目录拷贝到src/main/cpp/目录下,并改名为test。
3、从“生成har包供外部module调用”中的第2步开始逐步检查并配置


















暂无评论内容