HarmonyOS ArkTS与c++交互通信

一、创建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))
  }

 

                

相关推荐

  1. QMLC++交互

    2023-12-07 19:40:03       16 阅读
  2. UnityAndroid交互通信系列(6)

    2023-12-07 19:40:03       4 阅读
  3. QMLC++交互详解

    2023-12-07 19:40:03       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 19:40:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 19:40:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 19:40:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 19:40:03       20 阅读

热门阅读

  1. 当内核有内存泄漏的时候

    2023-12-07 19:40:03       27 阅读
  2. 【Spark基础】-- 宽窄依赖

    2023-12-07 19:40:03       34 阅读
  3. 拥有一台服务器可以做些什么

    2023-12-07 19:40:03       41 阅读
  4. Spark SQL百万级数据批量读写入MySQL

    2023-12-07 19:40:03       39 阅读
  5. 什么问题适合使用卡方检验?

    2023-12-07 19:40:03       28 阅读
  6. qt 链表QList,QLinkedList的常见使用

    2023-12-07 19:40:03       38 阅读
  7. 英伟达显卡系列与架构、代表产品

    2023-12-07 19:40:03       34 阅读
  8. Ubuntu 配置打开文件限制

    2023-12-07 19:40:03       43 阅读
  9. Python批量图像处理--图片重命名、图片旋转

    2023-12-07 19:40:03       40 阅读
  10. CG 函数

    2023-12-07 19:40:03       40 阅读
  11. 解决分布式React前端在本地开发环境的跨域问题

    2023-12-07 19:40:03       38 阅读
  12. 关于业界大语言模型(LLM)开源的一些看法

    2023-12-07 19:40:03       33 阅读
  13. 供应链产品经理常用的ChatGPT通用提示词模板

    2023-12-07 19:40:03       37 阅读
  14. MyBatis

    MyBatis

    2023-12-07 19:40:03      41 阅读