HarmonyOS Native层取到音频或图片数据流怎么传到ArkTS层?

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

可以通过arraybuffer实现了ArkTS与Native C++ 之间的音频数据相互传递。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;
  // 数据类型
  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);

  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;
}

Index.ets

@Entry
@Component
struct Index {
  napiArray?:Int32Array
  build() {
    Row() {
      Column() {
        Button("NAPI2TS")//接收Native侧返回的Array 
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.napiArray= testNapi.NAPI2TS()
            for(let num of this.napiArray) {
              console.info("NAPI2TS: JS   " + num.toString())
            }
          })
        //向Native侧传入Array 
        Button("TS2NAPI")
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            if(this.napiArray){
              testNapi.TS2NAPI(this.napiArray)
              for(let num of this.napiArray) {
                console.info("TS2NAPI: JS   " + num.toString())
              }
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 如何解压数据流
490浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
389浏览 • 1回复 待解决
HarmonyOS 从C++触发通知到ArkTS
113浏览 • 1回复 待解决
HarmonyOS nativejs代码调用
72浏览 • 1回复 待解决
使用http模块实现数据流请求
1137浏览 • 1回复 待解决
native创建socket异常
496浏览 • 1回复 待解决
HarmonyOS护眼模式方案咨询
24浏览 • 1回复 待解决
native多进程场景的调试
343浏览 • 1回复 待解决
如何在Native加载so库
1241浏览 • 1回复 待解决
如何在native获取屏幕亮度
1882浏览 • 1回复 待解决
HarmonyOS Native获取应用路径的方式
423浏览 • 1回复 待解决
HarmonyOS native是否支持curl和openSSL
479浏览 • 1回复 待解决