ArkTS跨语言交互

简介

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步开始逐步检查并配置

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容