鸿蒙-ArkTS和Native之间的交互使用3使用Node-API接口创建基本数据类型

仿佛云烟
发布于 2025-6-28 16:46
浏览
0收藏

引言:

鸿蒙-ArkTS和Native之间的交互使用3使用Node-API接口创建基本数据类型-鸿蒙开发者社区


ArkTS的Number类型是一个双精度64位二进制格式IEEE 754值。只有在-253+1到253-1范围内(闭区间)的整数才能在不丢失精度的情况下被表示,在超过该取值范围的情况下,需要使用BigInt对应的NPI接口来处理更大范围的整数。


使用Node-API接口进行数值类型的创建和获取时有如下几种类型:


接口

描述

napi_get_value_uint32

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

napi_get_value_int32

将ArkTS环境中获取的number类型数据转为Node-API模块中的int32类型数据。

napi_get_value_int64

将ArkTS环境中获取的number类型数据转为Node-API模块中的int64类型数据。

napi_get_value_double

将ArkTS环境中获取的number类型数据转为Node-API模块中的double类型数据。

napi_create_int32

将Node-API模块中的int32_t类型转换为ArkTS环境中number类型。

napi_create_uint32

将Node-API模块中的uint32_t类型转换为ArkTS环境中number类型。

napi_create_int64

将Node-API模块中的int64_t类型转换为ArkTS环境中number类型。

napi_create_double

将Node-API模块中的double类型转换为ArkTS环境中number类型。


从Node-API模块数值类型转换为ArkTS数值类型值,或者从ArkTS数据类型值转换为Node-API模块数值类型。在进行数据类型转换时,需要注意数据范围是否匹配,以及有无符号整数和双精度数值等区别。


使用示例(以napi_get_value_int32为例)


获取napi_get_value_int32数据方法


cpp部分代码:


#include "napi/native_api.h"


static napi_value GetValueInt32(napi_env env, napi_callback_info info)
{
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    int32_t result32 = 0;
    // 解析传递的参数
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    // 将前端传过来的参数转为Node-API模块的int32类型
    napi_status status = napi_get_value_int32(env, args[0], &result32);
    // 如果传递的参数不是数字napi_get_value_int32接口将会返回napi_number_expected,设置函数返回nullptr
    if (status == napi_number_expected) {
        return nullptr;
    }
    // 调用napi_create_int32接口将int32类型的数据转为napi_value返回
    napi_value napiResult32 = nullptr;
    napi_create_int32(env, result32, &napiResult32);
    return napiResult32;
}


接口声明:


// index.d.ts
export const getValueInt32: (value: number | string) => number | void;


ArkTS侧示例代码


import hilog from '@ohos.hilog';
import testNapi from 'libentry.so';


// 传入非数字“ss”时函数返回undefined
hilog.info(0x0000, 'Node-API', 'get_value_int32_not_number %{public}s', testNapi.getValueInt32('ss'));
// 传入int32范围内的数字100时函数返回原数字
hilog.info(0x0000, 'Node-API', 'get_value_int32_number %{public}d', testNapi.getValueInt32(100));
// 传入68719476735,此数字的二进制为111111111111111111111111111111111111,在int32类型中此二进制代表数字-1
hilog.info(0x0000, 'Node-API', 'get_value_int32_oversize %{public}d', testNapi.getValueInt32(68719476735));
// 大于2的31次-1的数字且不是二进制为111111111111111111111111111111111111这样的在int32中有特殊含义的数字也会溢出,导致数值发生改变,返回值按后32位二进制编码解码
hilog.info(0x0000, 'Node-API', 'get_value_int32_oversize %{public}d', testNapi.getValueInt32(687194767355));
// 传入NAN(not a number)、+Infinity(正无穷)或-Infinity(负无穷),会返回数字0
hilog.info(0x0000, 'Node-API', 'get_value_int32_number_NAN %{public}d', testNapi.getValueInt32(NaN));
hilog.info(0x0000, 'Node-API', 'get_value_int32_number_+Infinity %{public}d', testNapi.getValueInt32(+Infinity));
hilog.info(0x0000, 'Node-API', 'get_value_int32_number_-Infinity %{public}d', testNapi.getValueInt32(-Infinity));


创建napi_get_value_int32数据方法


cpp部分代码


#include "napi/native_api.h"
static constexpr int INT_NUM_NEG_26 = -26;   // int类型数值-26


static napi_value CreateInt32(napi_env env, napi_callback_info info)
{
    // int32_t是有符号的32位整数类型,表示带有符号的整数,它的范围是从-231到231 - 1,也就是-2147483648到2147483647
    // 要表示的整数值
    int32_t value = INT_NUM_NEG_26;
    // 创建ArkTS中的int32数字
    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;
}


接口声明


// index.d.ts
export const createInt32: () => number;


ArkTS侧示例代码:


import hilog from '@ohos.hilog';
import testNapi from 'libentry.so';


hilog.info(0x0000, 'testTag','Test Node-API napi_create_int32:' + testNapi.createInt32());


  • ArkTS交互在开发过程中,需要考虑如何将创建的数值类型值与ArkTS环境进行交互,包括传递参数、返回值等。

分类
收藏
回复
举报
回复
    相关推荐