HarmonyOS ArkTS和Native怎么传递二进制块,napi支持的基础类型似乎不包括,是否有参考示例

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

数据传递是arraybuffer,数据相互传递参考代码如下:

// Index.ets
Button("NAPI2TS")
  .fontSize(50)
  .fontWeight(FontWeight.Bold)
  .onClick(() => {
    let napiArray: Int32Array = testNapi.NAPI2TS()
    console.info("NAPI2TS: JS " + napiArray)
  })

Button("TS2NAPI")
  .fontSize(50)
  .fontWeight(FontWeight.Bold)
  .onClick(() => {
    let napiArray: Int32Array = new Int32Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    console.info("TS2NAPI: JS " + napiArray)
    testNapi.TS2NAPI(napiArray)
  })

Native侧接受传入的ArkTS Array:

// TS array 传到NAPI层
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);
        int32_t num = length / sizeof(int32_t);

        string str = "";
        for (int32_t i = 0; i < num; i++) {
            int32_t tmp = *((int32_t *)(data_bytes) + i);
            str += (to_string(tmp) + ' ');
        }
        OH_LOG_INFO(LOG_APP, "TS2NAPI: C++ %{public}s", str.c_str());
    }
    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;
    }
    string str = "";
    for (int32_t i = 0; i < num; i++) {
        int32_t tmp = *((int32_t *)(output_ptr) + i);
        str += (to_string(tmp) + ' ');
    }
    OH_LOG_INFO(LOG_APP, "NAPI2TS: C++ %{public}s", str.c_str());

    return output_array;
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 二进制转16进制
209浏览 • 1回复 待解决
native层如何访问rawfile二进制文件
2032浏览 • 1回复 待解决
如何对二进制进行AES解密?
423浏览 • 1回复 待解决
HarmonyOS进制二进制方法
217浏览 • 1回复 待解决
如何直接加载二进制图片?
3026浏览 • 1回复 待解决
jsbind--二进制包导入指导
956浏览 • 1回复 待解决
HarmonyOS gzip二进制流压缩和解压缩
1123浏览 • 1回复 待解决
HarmonyOS 图片二进制流jpeg格式转换
31浏览 • 1回复 待解决
base目录内容会被编译成二进制
191浏览 • 1回复 待解决