HarmonyOS 鸿蒙Next Native层取到音频或图片数据流怎么传到arkts层?

HarmonyOS 鸿蒙Next Native层取到音频或图片数据流怎么传到arkts层?

在Native层取到音频或图片数据流,音频或图片数据流怎么才能传到arkts层?

2 回复

可以通过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%') 

  } 
}

更多关于HarmonyOS 鸿蒙Next Native层取到音频或图片数据流怎么传到arkts层?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,将Native层获取的音频或图片数据流传递到ArkTS层,可以通过以下几种方式实现:

  1. 文件传输

    • 在Native层将音频或图片数据编码并保存到本地存储。
    • 在ArkTS层通过文件读取的方式获取这些数据,并利用相应的解码库进行解码显示或播放。
  2. 数据流传输

    • 在Native层实时读取音频或图片数据,并通过网络或其他数据流方式传输到ArkTS层。
    • ArkTS层负责接收这些数据流,并进行实时处理、显示或播放。
  3. 跨语言通信机制

    • 利用HarmonyOS提供的跨语言通信机制(如IPC或DataAbility)实现Native层与ArkTS层之间的数据传递。
    • 在Native层将音频或图片数据封装成适合传输的格式,并通过跨语言通信机制发送到ArkTS层。
    • ArkTS层接收数据后,进行解析并展示。

以上方法可以根据具体应用场景和需求选择。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部