如何使用napi_create_typedarray接口创建不同类型的TypedArray?

阅读 611
avatarAI BotBETA
要使用 `napi_create_typedarray` 接口创建不同类型的 TypedArray,你需要按照以下步骤操作:

1. **确定要创建的 TypedArray 类型**:例如 `napi_int8_array`、`napi_uint8_array`、`napi_uint8_clamped_array`、`napi_int16_array`、`napi_uint16_array`、`napi_int32_array`、`napi_uint32_array`、`napi_float32_array` 或 `napi_float64_array`。

2. **准备底层 ArrayBuffer**:TypedArray 是基于 ArrayBuffer 的视图,因此你需要先创建一个足够大的 ArrayBuffer。

3. **调用 `napi_create_typedarray`**:将 ArrayBuffer 和你选择的 TypedArray 类型传递给 `napi_create_typedarray` 函数。

以下是一个示例代码片段,展示了如何创建一个 `Int32Array`:

napi_value array_buffer, typed_array;
size_t byte_length = 16; // 例如,创建一个包含 4 个 Int32 的 TypedArray

// 创建 ArrayBuffer
napi_status status = napi_create_arraybuffer(env, byte_length, &array_buffer, NULL);
if (status != napi_ok) {

// 处理错误

}

// 获取 ArrayBuffer 的数据指针
void* data;
status = napi_get_arraybuffer_info(env, array_buffer, &data, NULL);
if (status != napi_ok) {

// 处理错误

}

// 创建 Int32Array TypedArray
napi_valuetype array_type = napi_int32_array;
status = napi_create_typedarray(env, array_type, array_buffer, 0, byte_length / sizeof(int32_t), &typed_array);
if (status != napi_ok) {

// 处理错误

}

// 现在 typed_array 是一个指向 Int32Array 的 napi_value


在这个示例中,我们首先创建了一个长度为 16 字节的 ArrayBuffer,然后基于这个 ArrayBuffer 创建了一个 `Int32Array` TypedArray(由于每个 `int32` 占 4 字节,所以长度为 16 字节的 ArrayBuffer 可以存储 4 个 `int32` 值)。

不同的 TypedArray 类型只需要更改 `napi_valuetype` 的值(例如 `napi_uint8_array`、`napi_float64_array` 等)以及相应地调整 `byte_length / sizeof(type)` 的计算即可。
1 个回答

在C++代码中,获取ArkTS侧传入的类型参数,根据类型值选择创建对应的TypedArray类型。通过napi_create_arraybuffer创建ArrayBuffer,再使用napi_create_typedarray基于ArrayBuffer创建TypedArray并返回。示例代码如下:

#include "napi/native_api.h"

static napi_value CreateTypedArray(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);
    int32_t typeNum = 0;
    napi_get_value_int32(env, args[0], &typeNum);
    napi_typedarray_type arrayType;
    size_t elementSize = 0;
    arrayType = static_cast<napi_typedarray_type>(typeNum);
    switch (typeNum) {
        case napi_int8_array:
        case napi_uint8_array:
        case napi_uint8_clamped_array:
            elementSize = sizeof(int8_t);
            break;
        case napi_int16_array:
        case napi_uint16_array:
            elementSize = sizeof(int16_t);
            break;
        case napi_int32_array:
        case napi_uint32_array:
            elementSize = sizeof(int32_t);
            break;
        case napi_float32_array:
            elementSize = sizeof(float);
            break;
        case napi_float64_array:
            elementSize = sizeof(double);
            break;
        case napi_bigint64_array:
        case napi_biguint64_array:
            elementSize = sizeof(int64_t);
            break;
        default:
            arrayType = napi_int8_array;
            elementSize = sizeof(int8_t);
            break;
    }
    size_t length = 3;
    napi_value arrayBuffer = nullptr;
    napi_value typedArray = nullptr;
    void *data;
    napi_create_arraybuffer(env, length * elementSize, (void **)&data, &arrayBuffer);
    napi_create_typedarray(env, arrayType, length, arrayBuffer, 0, &typedArray);
    return typedArray;
}

ArkTS侧调用该接口并传入类型值,如let typedArray = testNapi.createTypedArray<Int8Array>(testNapi.TypedArrayTypes["INT8_ARRAY"]);,同时需在模块初始化部分定义TypedArrayTypes供ArkTS侧使用,如在Init函数中创建对象并设置属性。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进