ArkTS与C/C++之间交互,涉及到跨语言调用中数据转换,以及跨线程交互等内容。沿用Node-API标准实现,支持的Node-API接口可参见Node-API支持的数据类型和接口。当前可以通过AKI三方库实现跨语言调用。AKI针对OpenHarmony上提供ArkTS与C/C++跨语言互调的场景提供解决方案,提供了极简语法糖使用方式,一行代码完成ArkTS与C/C++的无障碍跨语言互调,所见即所得。同时开发者无需关心Node-API的线程安全问题、Native对象GC问题,为开发者屏蔽Node-API内部复杂逻辑。1.ohpm HAR包依赖:指定路径下(如:项目根路径/entry),输入如下命令安装ohpm har包依赖。cd entry ohpm install @ohos/akiCMakeLists.txt添加依赖(假定编译动态库名为:libhello.so):# ... # 1. 设置AKI根路径 set(AKI_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@ohos/aki) set(CMAKE_MODULE_PATH ${AKI_ROOT_PATH}) find_package(Aki REQUIRED) # ... add_library(entry SHARED napi_init.cpp) # 2. 链接二进制依赖 & 头文件,需要确保target(例如为entry)与add_library()方法中的target保持一致 target_link_libraries(entry PUBLIC Aki::libjsbind)在右上角同步工程:2.在napi_init.cpp文件中用户自定义业务,并将业务的接口导出给ArkTS。#include <aki/jsbind.h> #include <string> // 1、用户自定义业务 std::string SayHello(std::string msg){ return msg + " too.";} // 2、导出业务接口 // Step 1 注册 AKI 插件 JSBIND_ADDON(entry) // 注册 AKI 插件名: 即为编译*.so名称,规则与Node-API一致 // Step 2 注册 FFI 特性 JSBIND_GLOBAL() { JSBIND_FUNCTION(SayHello); }说明:注册的AKI插件名需要与模块级的oh-package.json5文件dependencies标签的“lib<AKI插件名>”(例如libentry.so)字段名称保持一致。a.在“src/main/cpp/types/libentry/index.d.ts”中导出.so文件的接口声明。export const SayHello: (msg: string) => string;b.在ArkTS文件中调用.so文件中的代码接口。import aki from 'libentry.so' // 工程编译出来的*.so @Entry @Component struct Index { @State message: string = 'Hello World'; build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { console.info(aki.SayHello("hello world")); // 调用.so文件中的代码接口 }) } .width('100%') } .height('100%') } }参考链接AKI项目介绍
ArkTS与C/C++之间交互,涉及到跨语言调用中数据转换,以及跨线程交互等内容。沿用Node-API标准实现,支持的Node-API接口可参见Node-API支持的数据类型和接口。
当前可以通过AKI三方库实现跨语言调用。AKI针对OpenHarmony上提供ArkTS与C/C++跨语言互调的场景提供解决方案,提供了极简语法糖使用方式,一行代码完成ArkTS与C/C++的无障碍跨语言互调,所见即所得。同时开发者无需关心Node-API的线程安全问题、Native对象GC问题,为开发者屏蔽Node-API内部复杂逻辑。
1.ohpm HAR包依赖:
指定路径下(如:项目根路径/entry),输入如下命令安装ohpm har包依赖。
CMakeLists.txt添加依赖(假定编译动态库名为:libhello.so):
在右上角同步工程:
2.在napi_init.cpp文件中用户自定义业务,并将业务的接口导出给ArkTS。
说明:
注册的AKI插件名需要与模块级的oh-package.json5文件dependencies标签的“lib<AKI插件名>”(例如libentry.so)字段名称保持一致。
a.在“src/main/cpp/types/libentry/index.d.ts”中导出.so文件的接口声明。
b.在ArkTS文件中调用.so文件中的代码接口。
参考链接
AKI项目介绍