如何通过AKI三方库实现ArkTS与C/C++之间的跨语言调用?

如何通过AKI三方库实现ArkTS与C/C++之间的跨语言调用

阅读 4.6k
1 个回答

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/aki

CMakeLists.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)

在右上角同步工程:

image.png

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项目介绍

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进