HarmonyOS 鸿蒙Next TS和C++实时通信

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next TS和C++实时通信

TS只负责UI展示,C++层负责业务逻辑的执行 C++层执行过程会产生大量的日志,目前是直接输出在控制台,现在想实时输出到TS的UI上,是要写一个回调吗?对NAPI不熟悉,看文档没有找到合适的方法。有什么建议吗  

3 回复

是的,需要通过回调的方式实现,你可以参考以下示例代码实现您的需求:
1、在index.d.ts中链接ArkTS侧函数与C++侧函数:


export const nativeCallArkTS: (cb: (a: string) => string) => string;

2、在C++测调用ArkTS侧函数:


static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) {

    size_t argc = 1;

    // 声明参数数组

    napi_value args[1] = {nullptr};

​

    // 获取传入的参数并依次放入参数数组中

    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

​

    // 创建一个string,作为ArkTS的入参

    napi_value argv = nullptr;

    napi_create_string_utf8(env, "yes", 3, &argv);

​

    // 调用传入的callback,并将其结果返回

    napi_value result = nullptr;

    napi_call_function(env, nullptr, args[0], 1, &argv, &result);

    return result;

}

3、将NativeCallArkTS接口导出:


EXTERN_C_END

EXTERN_C_START

static napi_value Init(napi_env env, napi_value exports)

{

    napi_property_descriptor desc[] = {

        {"nativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr}

    };

    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);

    return exports;

}

4、在ArkTS中调用函数:


import nativeFun from 'libentry.so';

​

@Entry

@Component

struct Index {

  @State message: string = 'nativeCallArkTS';

​

  build() {

    Row() {

      Column() {

        Text(this.message)

          .onClick(() => {

            this.message += nativeFun.nativeCallArkTS((a: string)=> {

              return a })

          })

      }

      .width('100%')

    }

    .height('100%')

  }

}

您可以在C++侧定义一个string类型的变量存储动态接收的字符串,并在将其转换成char*类型后传入napi_create_string_utf8


std::string str = "HelloArkTS";

    const char* str1 = str.c_str();

    napi_create_string_utf8(env, str1, sizeof(str), &argv);

参考文档:Node-API支持的数据类型和接口-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

env在不同线程间是不共享的,因此需要在每个线程中使用独立的env实例。

更多关于HarmonyOS 鸿蒙Next TS和C++实时通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


用vsync轮询获取日志?

HarmonyOS 鸿蒙Next TS与C++实时通信主要通过系统提供的IPC(进程间通信)机制实现。Next TS作为鸿蒙系统的组件框架,与C++之间的通信可以利用鸿蒙的分布式能力,具体实现方式如下:

  1. 消息队列:通过鸿蒙提供的消息队列服务,Next TS可以发送消息给C++进程,C++进程同样可以接收并处理这些消息。消息队列支持高效的数据传递,适用于实时性要求较高的场景。

  2. 远程服务调用:鸿蒙支持远程服务调用(Remote Service Call),Next TS可以调用C++提供的远程服务接口,实现双向通信。这种方式适用于复杂的业务逻辑和数据交换。

  3. 共享内存:对于需要高速数据传输的场景,可以使用共享内存。Next TS和C++进程可以访问同一块内存区域,实现数据的快速读写。但需注意数据同步和访问控制,以避免数据竞争。

  4. 数据通道:鸿蒙提供的数据通道服务,可用于传输流媒体数据等实时性要求极高的内容。Next TS可以将数据通过数据通道发送给C++进程,实现低延迟的实时通信。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部