HarmonyOS native C++ 层传递buffer 到ArkTS 层

HarmonyOS
2024-12-19 17:01:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

Native C++ 侧接收传入的 ArkTS Array,需要通过 napi_get_typedarray_info 将获取到的数据传入数组 typedarray 生成 input_buffer ,然后通过 napi_get_arraybuffer_info 获取数组数据。对应的,ArkTS 侧 接收 Native C++ 侧返回的 Array,通过 napi_create_arraybuffer 创建一个 arraybuffer 数组,根据创建的 arraybuffer 通过 napi_create_typedarray 创建一个 typedarray 并将 arraybuffer 存入 output_array,然后给 arraybuffer 赋值,最后返回 output_array。参考代码如下:

Native侧接收传入的 ArkTS Array

static napi_value TS2NAPI(napi_env env, napi_callback_info info)
{
  // 获取TS层传来的参数
  size_t argc = 1;
  napi_value args;
  napi_get_cb_info(env, info, &argc, &args, NULL, NULL);
  napi_value input_array = args;
  
  // 获取传入数组typedarray生成input_buffer
  napi_typedarray_type type;// 数据类型
  napi_value input_buffer;
  size_t byte_offset;//数据偏移
  size_t i, length;//数据字节大小
  napi_get_typedarray_info(env, input_array, &type, &length, NULL, &input_buffer, &byte_offset);
  
  // 获取数组数据
  void *data;
  size_t byte_length;
  napi_get_arraybuffer_info(env, input_buffer, &data, &byte_length);
  
  // 遍历数组
  if (type == napi_int32_array) {
    int32_t *data_bytes = (int32_t *)(data);
    for (i = 0; i < length/sizeof(int32_t); i++) {
      OH_LOG_INFO(LOG_APP, "TS2NAPI: C++  %{public}d", *((int32_t *)(data_bytes) + i));
    }
  }
  
  return NULL;
}

TS侧 接收 Native侧返回的Array

// NAPI层 array 传到TS层
static napi_value NAPI2TS(napi_env env, napi_callback_info info)
{
  // 数据个数
  int num = 10;
  // 创建output_buffer
  napi_value output_buffer;
  void *output_ptr = NULL;
  napi_create_arraybuffer(env, num * sizeof(int32_t), &output_ptr, &output_buffer);

  // output_array
  napi_value output_array;
  napi_create_typedarray(env, napi_int32_array, num, output_buffer, 0, &output_array);

  // 给output_ptr、output_buffer赋值
  int32_t * output_bytes = (int32_t *)output_ptr;
  for (int32_t i = 0; i < num; i++) {
  output_bytes[i] = i;
}

  for (int32_t i = 0; i < num; i++) {
  OH_LOG_INFO(LOG_APP, "NAPI2TS: C++  %{public}d", *((int32_t *)(output_ptr) + i));
}

  return output_array;
}
分享
微博
QQ
微信
回复
2024-12-19 18:31:05
相关问题
HarmonyOSC++触发通知ArkTS
515浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
812浏览 • 1回复 待解决
ts给c++传递数组,c++如何解析
2271浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
1132浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1518浏览 • 1回复 待解决
HarmonyOS ETS和c++通信
493浏览 • 1回复 待解决
HarmonyOS C++自定义组件如何开发?
774浏览 • 1回复 待解决