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) |
