鸿蒙 NDK开发:基本数据类型的转换(十)

NDK开发中,基本数据类型的转换是跨语言交互的基础。Node-API提供了丰富的接口用于创建和获取int32、uint32、int64、double、boolean、string等基本数据类型。

一、数值类型范围

类型 范围 说明
int32_t -2³¹ ~ 2³¹-1(-2147483648 ~ 2147483647) 有符号32位整数
uint32_t 0 ~ 2³²-1(0 ~ 4294967295) 无符号32位整数
int64_t -2⁶³ ~ 2⁶³-1 有符号64位整数
double 双精度64位IEEE 754值 浮点数

备注:ArkTS的Number类型是双精度64位IEEE 754值,只有在-2⁵³+1到2⁵³-1范围内(闭区间)的整数才能在不丢失精度的情况下被表示。超过该范围需要使用BigInt对应的Node-API接口。

二、核心接口

2.1 获取值接口(ArkTS → Native)

接口 转换目标 说明
napi_get_value_uint32 uint32_t 获取无符号32位整数
napi_get_value_int32 int32_t 获取有符号32位整数
napi_get_value_int64 int64_t 获取有符号64位整数
napi_get_value_double double 获取双精度浮点数
napi_get_value_bool bool 获取布尔值
napi_get_value_string_utf8 char* (UTF-8) 获取UTF-8字符串
napi_get_value_string_utf16 char16_t* (UTF-16) 获取UTF-16字符串
napi_get_value_string_latin1 char* (Latin-1) 获取Latin-1字符串

2.2 创建值接口(Native → ArkTS)

接口 输入类型 说明
napi_create_int32 int32_t 创建int32数字
napi_create_uint32 uint32_t 创建uint32数字
napi_create_int64 int64_t 创建int64数字
napi_create_double double 创建double数字
napi_get_boolean bool 创建boolean值
napi_create_string_utf8 char* (UTF-8) 创建UTF-8字符串
napi_create_string_utf16 char16_t* (UTF-16) 创建UTF-16字符串
napi_create_string_latin1 char* (Latin-1) 创建Latin-1字符串

三、使用示例

3.1 napi_get_value_uint32

将ArkTS value转为Node-API模块中的uint32类型数据。

复制代码
static napi_value GetValueUint32(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value argv[1] = {nullptr};
    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
    
    uint32_t number = 0;
    napi_status status = napi_get_value_uint32(env, argv[0], &number);
    if (status != napi_ok) {
        return nullptr;  // 传入非数字返回nullptr
    }
    
    napi_value result = nullptr;
    napi_create_uint32(env, number, &result);
    return result;
}

3.2 napi_get_value_int32

将ArkTS value转为Node-API模块中的int32类型数据。

复制代码
static napi_value GetValueInt32(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 result32 = 0;
    napi_status status = napi_get_value_int32(env, args[0], &result32);
    if (status != napi_ok) {
        return nullptr;
    }
    
    napi_value napiResult32 = nullptr;
    napi_create_int32(env, result32, &napiResult32);
    return napiResult32;
}

特殊值

  • 传入非数字 → 返回undefined

  • 传入NaN、+Infinity、-Infinity → 返回0

  • 超出int32范围 → 按后32位二进制编码解码

3.3 napi_get_value_int64

将ArkTS value转为Node-API模块中的int64类型数据。

复制代码
static napi_value GetValueInt64(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);
    
    int64_t result64 = 0;
    napi_status status = napi_get_value_int64(env, args[0], &result64);
    if (status != napi_ok) {
        return nullptr;
    }
    
    napi_value napiResult64 = nullptr;
    napi_create_int64(env, result64, &napiResult64);
    return napiResult64;
}

注意:超出int64表示范围的数字会溢出,失去精度。

3.4 napi_get_value_double

将ArkTS value转为Node-API模块中的double类型数据。

复制代码
static napi_value GetDouble(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);
    
    double value = 0;
    napi_status status = napi_get_value_double(env, args[0], &value);
    if (status != napi_ok) {
        return nullptr;
    }
    
    napi_value result = nullptr;
    napi_create_double(env, value, &result);
    return result;
}

3.5 napi_create_int32

创建ArkTS数字(int32类型)的值。

复制代码
static napi_value CreateInt32(napi_env env, napi_callback_info info) {
    int32_t value = -26;
    napi_value result = nullptr;
    napi_status status = napi_create_int32(env, value, &result);
    if (status != napi_ok) {
        napi_throw_error(env, nullptr, "Failed to create int32 value");
    }
    return result;
}

3.6 napi_create_uint32

创建ArkTS数字(uint32类型)的值。

复制代码
static napi_value CreateUInt32(napi_env env, napi_callback_info info) {
    // uint32_t范围:0 ~ 4294967295
    uint32_t value = 26;
    napi_value result = nullptr;
    napi_status status = napi_create_uint32(env, value, &result);
    if (status != napi_ok) {
        napi_throw_error(env, nullptr, "Failed to create uint32 value");
    }
    return result;
}

注意 :如果使用uint32_t定义负数(如-26),会发生溢出,输出4294967270

3.7 napi_create_int64

创建ArkTS数字(int64类型)的值。

复制代码
static napi_value CreateInt64(napi_env env, napi_callback_info info) {
    // int64_t范围:-2^63 ~ 2^63-1
    int64_t value = 2147483648;
    napi_value result = nullptr;
    napi_status status = napi_create_int64(env, value, &result);
    if (status != napi_ok) {
        napi_throw_error(env, nullptr, "Failed to create int64 value");
    }
    return result;
}

注意 :如果数值超过2⁵³,请使用napi_create_bigint64接口。

3.8 napi_create_double

创建ArkTS数字(double类型)的值。

复制代码
static napi_value CreateDouble(napi_env env, napi_callback_info info) {
    double value = 1.234;
    napi_value result = nullptr;
    napi_status status = napi_create_double(env, value, &result);
    if (status != napi_ok) {
        napi_throw_error(env, nullptr, "Failed to create double value");
    }
    return result;
}

四、CMakeLists.txt配置

如需在Native C++中打印日志:

复制代码
add_definitions( "-DLOG_DOMAIN=0xd0d0" )
add_definitions( "-DLOG_TAG=\"testTag\"" )
target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so)

五、注意事项

注意事项 说明
非数字输入 napi_get_value_*传入非数字返回napi_number_expected
NaN/Infinity 传入NaN、+Infinity、-Infinity → 返回0
int32溢出 超出int32范围按后32位二进制编码解码
int64溢出 超出int64范围会溢出,失去精度
uint32负值 用uint32_t定义负数会发生溢出
大整数 超过2⁵³请使用BigInt接口(napi_create_bigint64)