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

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

HarmonyOS
2024-03-19 16:25:34
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
kaijunx

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) 

在右上角同步工程:

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

分享
微博
QQ
微信
回复
2024-03-20 00:11:36
相关问题
如何实现ArkTSC/C++数组转换
27浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
502浏览 • 0回复 待解决
如何实现ArkTSC/C++对象传递
38浏览 • 1回复 待解决
ArkTSC++互相直接调用
604浏览 • 1回复 待解决
ArkTSC++之间交互
493浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
512浏览 • 1回复 待解决
C++调用ArkTS 定义方法
691浏览 • 1回复 待解决
如何C/C++ 创建ArkTS对象
977浏览 • 1回复 待解决
aki是否支持C++虚函数和callback?
521浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
585浏览 • 1回复 待解决
实现弹幕功能三方
603浏览 • 1回复 待解决
C++ 如何获取操作 Arkts 实例
440浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
395浏览 • 1回复 待解决
如何获取可用三方
838浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
429浏览 • 1回复 待解决
基于HAR模块C++头文件引用
333浏览 • 1回复 待解决