HarmonyOS ArkTS与c++交互通信

news/2024/5/20 4:36:18 标签: HarmonyOS, OpenHarmony, ts

一、创建Native C++ Module

1、右键项目->new->module

如图:

2、修改build-profile.json5配置

"externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "arguments": "-v -DOHOS_STL=c++_shared",
      "abiFilters": [
//        "armeabi-v7a",
//        "x86_64",
        "arm64-v8a"
      ],
      "cppFlags": ""
    }

3、CMakeLists.txt 配置如下:

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(MyApplication43)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include)

add_library(application SHARED SRRtcVideoEngineNapi.cpp SRRtcRoomCallBackNapi.cpp)
target_link_libraries(application PUBLIC libace_napi.z.so)

二、代码实现

1、主调接口实现

NAPI中缓存回调接口的变量,便于后面回调给TS

napi_value SRRtcVideoEngineNapi::setRRoomCallBack(napi_env env, napi_callback_info info) {
    LogE("setRRoomCallBack---一个参数:ISRoomCallBack");
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_status status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    if (status != napi_ok) {
        napi_throw_error(env, "", "");
        return nullptr;
    }
    // 缓存回调函数全局变量,回调ets用
    if (SRGlobalvar::napi_CallbackReference == nullptr) {
        LogE("setRRoomCallBack===new NapiCallBack()");
        SRGlobalvar::napi_CallbackReference = new NapiCallBack(); // 创建缓存函数
    }
    napi_create_reference(env, args[0], 1, &SRGlobalvar::napi_CallbackReference->roomCallBack_napi);
    SRGlobalvar::napi_CallbackReference->env = env;
    // 调用 底层sdk : RRoomControlMgr.setCallBack
    RResult rResult = sr_engineSdk->setRRoomCallBackRtcEngine();
    return SRGlobalvar::returnResult(env, rResult);
}

2、回调接口实现

通过缓存的env,callback对象,调用napi_call_function方法将数据传回给ts

void SRRtcRoomCallBackNapi::onRoomJoinConfirm(RResult rResult, const RRoomInfo &roomInfo) {
    // 处理 onRoomJoinConfirm 通知
    LogE("回调消息---SRRtcRoomCallBack:onRoomJoinConfirm ");
    // 转换N-API对象
    napi_value roomInfo_napi = SRGlobalvar::convertToSRRoomInfo(SRGlobalvar::napi_CallbackReference->env, roomInfo);
    napi_value rResult_napi = SRGlobalvar::convertToSRResult(SRGlobalvar::napi_CallbackReference->env, rResult);
    // 传递给TS
    napi_value callback;
    napi_get_reference_value(SRGlobalvar::napi_CallbackReference->env,
                             SRGlobalvar::napi_CallbackReference->roomCallBack_napi, &callback);
    napi_value jsMethod;
    napi_get_named_property(SRGlobalvar::napi_CallbackReference->env, callback, "onRoomJoinConfirm", &jsMethod);
    napi_value argv[] = {rResult_napi, roomInfo_napi};
    napi_value callbackResult = nullptr;
    napi_call_function(SRGlobalvar::napi_CallbackReference->env, nullptr, jsMethod, 2, argv, &callbackResult);
}

三、ets的接收c++传回的数据

1、index.d.ts 代码增加接口

function setRRoomCallBack(sroomCallback: ISRoomCallBack): SRReult

2、回调接口SRoomCallBack.ets

export class SRoomCallBack implements ISRoomCallBack {
  onRoomJoinConfirm(rResult: SRReult, roomInfo: SRRoomInfo) {
    SRLog.i(TAG, `onRoomJoinConfirm==回调测试完成=rResult:${JsonUtil.jsonToString(rResult)}\n roomInfo:${JsonUtil.jsonToString(roomInfo)}`)

  }
}

3、调用

import srrtcNapi from 'librtcvideo.so';

  setRRoomCallBackRtcEngine(callback: ISRoomCallBack) {
    let srResult = srrtcNapi.setRRoomCallBack(callback)
    SRLog.i(TAG, "setRRoomCallBackRtcEngine===srresult:" + JsonUtil.jsonToString(srResult))
  }

                

http://www.niftyadmin.cn/n/5231554.html

相关文章

MATLAB算法实战应用案例精讲-【图像处理】数字图像处理(补充篇)

目录 算法原理 数字图像处理常用算法 1.二值化: 2.海报化 3.灰度化

Qt实现右键菜单

一、实现方法 QWidget提供了虚函数: virtual void contextMenuEvent(QContextMenuEvent*event);覆写该函数,即可。 二、Example 创建一个基本的mainwindow项目, 头文件: class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWin…

【算法刷题】Day9

文章目录 611. 有效三角形的个数题干:题解:代码: LCR 179. 查找总价格为目标值的两个商品题干:题解:代码: 1137. 第 N 个泰波那契数题干:原理:1、状态表示(dp表里面的值所…

RPG项目01_场景及人物动画管理器

基于“RPG项目01_UI登录”,新建一个文件夹名为Model(模型) 将资源场景拖拽至Model中 找到相应场景双击进入 红色报错部分Clear清掉即可,我们可以重做 接下来另存场景 起名为Game 点击保存 场景就保存至Scene中了 在文件夹下新创建…

视频后期特效处理软件 Motion 5 mac中文版

Motion mac是一款运动图形和视频合成软件,适用于Mac OS平台。 Motion mac软件特点 - 精美的效果:Motion提供了多种高质量的运动图形和视频效果,例如3D效果、烟雾效果、粒子效果等,方便用户制作出丰富多彩的视频和动画。 - 高效的工…

2023年第十二届数学建模国际赛小美赛A题太阳黑子预测求解分析

2023年第十二届数学建模国际赛小美赛 A题 太阳黑子预测 原题再现: 太阳黑子是太阳光球上的一种现象,表现为比周围区域暗的暂时斑点。它们是由抑制对流的磁通量浓度引起的表面温度降低区域。太阳黑子出现在活跃区域内,通常成对出现&#xff…

斯托克斯公式及其应用

文章目录 斯托克斯公式定理定理条件右手规则定理结论和公式👺公式形式的选用 斯托克斯公式和格林公式的关系例例例分析 斯托克斯公式 斯托克斯(Stokes)公式是格林公式的推广格林公式表达了平面闭区域上的二重积分与其边界曲线上的曲线积分之间的关系而斯托克斯公式…

C/C++ 通过HTTP实现文件上传下载

WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持。它包括了一系列的函数,使得 Windows 应用程序能够进行网络通信、处理 HTTP 请求、FTP 操作等。WinInet 提供了一套…