HarmonyOS ArkTS 传入的number,使用napi_get_value_int32 还是napi_get_value_int64来接收

HarmonyOS ArkTS 传入的number,使用napi_get_value_int32 还是napi_get_value_int64来接收

HarmonyOS
2024-08-27 11:36:04
浏览
收藏 0
回答 4
待解决
回答 4
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 的 ArkTS 中,如果你需要通过 NAPI(Node.js API for C/C++)来接收传入的 ​​number​​​ 类型参数,根据你的具体需求决定使用 ​​napi_get_value_int32​​​ 还是 ​​napi_get_value_int64​​。

### 如何选择 ​​napi_get_value_int32​​ 或 ​​napi_get_value_int64​

  • napi_get_value_int32​:
  • 适用于接收范围在 -2^31 到 2^31-1 之间的整数。
  • napi_get_value_int64​:
  • 适用于接收范围在 -2^63 到 2^63-1 之间的整数。

### 示例代码

假设你正在编写一个 NAPI 模块,并且需要从 ArkTS 调用此模块并传递一个 ​​number​​ 参数。以下是如何实现的示例:

#### ArkTS 调用部分

// Example.arkts
import { NativeModule } from '@ohos/napi';

@Entry
@Component
struct MainComponent {
  build() {
    Button('Invoke Native Function')
      .onClick(() => {
        // 假设 nativeFunction 是从 NAPI 模块导出的函数
        let result = NativeModule.nativeFunction(42);
        console.log(`Result: ${result}`);
      })
  }
}

#### NAPI 模块部分

创建一个名为 ​​native_module.cpp​​ 的文件:

#include <napi.h>
#include <iostream>

napi_value NativeFunction(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value argv[1];
    napi_value thisArg;
    
    // 获取传入的参数
    napi_get_cb_info(env, info, &argc, argv, &thisArg, nullptr);

    int32_t int32Value;
    int64_t int64Value;

    // 尝试获取 int32 值
    napi_status status = napi_get_value_int32(env, argv[0], &int32Value);
    if (status == napi_ok) {
        std::cout << "Received int32 number: " << int32Value << std::endl;
    } else {
        // 如果无法获取 int32,则尝试获取 int64 值
        status = napi_get_value_int64(env, argv[0], &int64Value);
        if (status == napi_ok) {
            std::cout << "Received int64 number: " << int64Value << std::endl;
        } else {
            napi_throw_type_error(env, nullptr, "Invalid argument type. Expected a number.");
            return nullptr;
        }
    }

    // 返回原值作为结果
    napi_value result;
    napi_create_int32(env, int32Value, &result);  // 这里假设我们总是返回 int32

    return result;
}

napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc = {"nativeFunction", 0, NativeFunction, 0, 0, 0, napi_default, 0};
    napi_define_properties(env, exports, 1, &desc);
    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

### 编译与集成

  1. 配置 CMakeLists.txt 确保你的项目包含对这个 NAPI 模块的编译支持。添加以下内容到你的 CMakeLists.txt 文件中:
add_library(native_module SHARED native_module.cpp)
target_link_libraries(native_module PRIVATE napi)
  1. 构建项目
    使用以下命令进行构建:
mkdir build
cd build
cmake ..
make
  1. 安装和运行
    打包并部署你的应用,然后在设备上运行,观察控制台输出以验证接收到的值是否正确。

### 总结

根据具体需求选择使用 ​​napi_get_value_int32​​ 还是 ​​napi_get_value_int64​​ 接收 ArkTS 传入的 ​​number​​。如果确定数值范围在 32 位整数内,优先使用 ​​napi_get_value_int32​​,否则使用 ​​napi_get_value_int64​​。此外,可以结合两者使用,先尝试获取 32 位整数,再降级处理 64 位整数。

分享
微博
QQ
微信
回复
2024-09-24 17:26:22
superinsect

long型推荐napi_get_value_int64。

分享
微博
QQ
微信
回复
2024-08-27 19:14:30
因为活着就一定行

你好,可爱的开发者


这个问题,关于你提问的在HarmonyOS的ArkTS框架中处理传入的数字时,我们需要根据业务数据的范围来决择合适的接口。

你提到的有两个主要的接口:

  1. napi_get_value_int32: 这个接口专门用于处理32位整数。它返回一个C语言中的int32类型的值,适合处理那些范围在-2147483648到2147483647之间的整数。
  2. napi_get_value_int64: 当需要处理更大的数值,即64位整数时,应使用这个接口。它返回一个C语言中的int64类型的值,能够处理范围在-9223372036854775808到9223372036854775807之间的整数。

如果业务数据可以完全由32位整数来处理,优先选择​​napi_get_value_int32​​以获得更好的性能和资源利用效率。如果数值超出了32位整数的处理范围,那么应该转向64位整数,并使用​​napi_get_value_int64​​来确保数据的正确性和完整性。这种策略可以最大化代码的效率同时确保数据的安全和准确。

分享
微博
QQ
微信
回复
2024-08-28 06:50:19
醉丶斛觞

你说的这个问题,本质上就是数据类型的取值范畴,主要看你的值域范围符合 int 就用 Int ,Int满足不了就用 Long


Int16/Int32/Int64 就是对数据类型值域的封装,意思都一样Long Int Bype

分享
微博
QQ
微信
回复
2024-11-07 19:23:33
相关问题
mysql数据类型使用int类型和string类型
2533浏览 • 1回复 待解决
HarmonyOS NAPI调用ArkTS静态方法
418浏览 • 1回复 待解决
鸿蒙int类型转为Color类型怎么转?
8662浏览 • 4回复 已解决
使用componentSnapshot.get能力报错
689浏览 • 1回复 待解决
使用rcp模块能力发送Get请求
886浏览 • 1回复 待解决
HarmonyOS 获取Resource中value问题
313浏览 • 1回复 待解决
ArkTS import导入napi模块结果错误
2050浏览 • 0回复 待解决
kubectl get node修改name
2323浏览 • 0回复 待解决
Key-Value存储问题咨询
198浏览 • 1回复 待解决
napi 基本使用场景示例
1347浏览 • 1回复 待解决
提问
该提问已有0人参与 ,帮助了0人