当前位置: 首页 > news >正文

鸿蒙开发NDK之---- 如何将ArkTs的类型转化成C++对应的类型(基础类型,包含部分代码解释)

在开发NDK 的时候,是从ArkTs 层获取C++ 暴露的接口,ArkTS 去获取的时候传递的参数都是ArkTS 的类型,上一篇讲解了如何获取参数,那么在获取到传递过来的参数后,又如何把数据转换成对应的C语言类型呢?
N-API 提供了一系列用于不同数据类型转换的函数,命名规则通常为 napi_get_value_:

  1. 基本数据类型

napi_get_value_bool 从 napi_value 中提取布尔值(bool)。
napi_get_value_double 从 napi_value 中提取双精度浮点数(double,对应 JavaScript 的 Number)。
napi_get_value_int64 从 napi_value 中提取 64 位有符号整数(int64_t)。
napi_get_value_uint32 从 napi_value 中提取 32 位无符号整数(uint32_t)。
2. 字符串相关

napi_get_value_string_utf16 从 napi_value 中提取 UTF-16 编码的字符串。
napi_get_value_string_latin1 从 napi_value 中提取 Latin-1 编码的字符串。
3. 对象 / 数组相关
函数名 作用
napi_get_array_length 获取 JavaScript 数组的长度(返回 size_t)。
napi_get_element 获取 JavaScript 数组中指定索引的元素(napi_value)。
napi_get_named_property 获取 JavaScript 对象的属性值(通过属性名,返回 napi_value)。
4. 特殊类型

napi_is_array 判断 napi_value 是否为 JavaScript 数组(返回 bool)。
napi_is_function 判断 napi_value 是否为 JavaScript 函数(返回 bool)。
napi_is_object 判断 napi_value 是否为 JavaScript 对象(返回 bool)。

例如:ArkTS 层传递过来一个对象,属性是name 和 age ,这里面就是取两个参数,一个专场成string 类型 一个转化成int 类型

napi_value ObjectType::Obj(napi_env env, napi_callback_info info) {
size_t argc = 2;
napi_value args[2] = {nullptr};

if (napi_ok != napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)) {OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "ObjectType", "api_get_cb_info failed");return nullptr;
}char strTemp[20] = {};
size_t len;
int32_t num;
// Get strings and numbers.
if (napi_ok != napi_get_value_string_utf8(env, args[0], strTemp, 20, &len) ||napi_ok != napi_get_value_int32(env, args[1], &num)) {OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "ObjectType","napi_get_value_string_utf8 or napi_get_value_int32 failed");return nullptr;
}
}

你会发现上面
napi_get_value_string_utf8(env, args[0], strTemp, 20, &len)
这个是转化为string,但是第5个参数为什么传递len ,没有看到具体的数字呢,这个的参数具体含义如下:
参数名 类型 作用
env napi_env N-API 环境变量。
value napi_value 待提取的 JavaScript 值(需确保是 String 类型,否则返回错误)。
buf char* 输出参数,指向存储字符串的 C++ 字符数组(需提前分配内存)。
bufsize size_t 输入参数,buf 的最大容量(字节数)。
result_size size_t* 输出参数,指向存储实际字符串长度的变量(不包含终止符 \0)。若为 nullptr 则不返回长度。

因此他的原因如下:知识点
len 的值是由 napi_get_value_string_utf8 函数自动计算并返回的
api_get_value_string_utf8 函数的作用是将 JavaScript 字符串(args[0])转换为 C++ 中的 UTF-8 编码字符数组(strTemp)。在转换过程中,函数会:

自动计算 JavaScript 字符串的实际 UTF-8 编码字节长度(不包含终止符 \0)。
将这个长度值写入 len 变量中(通过 &len 指针传递)。

例如:

若 JavaScript 字符串是 "abc"(3 个字符,UTF-8 编码每个字符占 1 字节),则 len 会被赋值为 3。
若字符串包含中文字符(如 "你好",UTF-8 编码每个字符占 3 字节),则 len 会被赋值为 6(3 字节 × 2 个字符)。

二、为什么不需要手动计算实际长度?
napi_get_value_string_utf8 的设计初衷就是封装字符串长度的计算逻辑,开发者只需提供:

存储字符串的缓冲区(strTemp)和缓冲区大小(20,即最多能容纳 19 个有效字符 + 1 个 \0 终止符)。
用于接收实际长度的指针(&len)。

函数内部会自动处理:

计算原始 JavaScript 字符串的 UTF-8 编码长度。
将字符串内容写入缓冲区(若长度超过缓冲区大小,会截断并保证以 \0 结尾)。
将实际长度(截断前的原始长度,或完整长度)写入 len。

三、代码中 len 的作用
虽然代码中没有直接使用 len,但它的价值在于:

验证字符串是否被截断:若 len >= 20,说明原始字符串长度超过了缓冲区 strTemp 的容量(20 字节),实际存入 strTemp 的是截断后的内容(前 19 个字符 + \0)。
获取完整长度:即使字符串被截断,len 仍然会返回原始字符串的完整长度,方便开发者判断是否需要更大的缓冲区。

总结
len 是 napi_get_value_string_utf8 函数根据输入的 JavaScript 字符串自动计算的结果,代表该字符串的实际 UTF-8 编码字节长度(不含 \0)。开发者无需手动计算,只需通过指针接收即可。这一设计简化了字符串转换的流程,同时提供了长度校验的依据。

http://www.dtcms.com/a/279770.html

相关文章:

  • Jetson平台CSI摄像头采集与显示:gst-launch-1.0与OpenCV实战
  • 【linux V0.11】boot
  • 多生产者多消费者问题(操作系统os)
  • SpringCloud之Hystrix
  • 【DOCKER】-4 dockerfile镜像管理
  • linux网络存储——freeNAS的安装配置
  • Spring Cloud分布式配置中心:架构设计与技术实践
  • MFC/C++语言怎么比较CString类型 第一个字符
  • 读文章 Critiques of World model
  • Java(集合)
  • aspnetcore Mvc配置选项中的ModelMetadataDetailsProviders
  • SAP-ABAP:SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析
  • 交换类排序的C语言实现
  • Hello, Tauri!
  • 基于Android的景点旅游信息系统App
  • 使用aiohttp实现高并发爬虫
  • uni-app开发的页面跳转全局加载中
  • 基于HarmonyOS的智能灯光控制系统设计:从定时触发到动作联动全流程实战
  • C++ 中常见的字符串定义方式及其用法
  • 1111自己
  • 基础分类模型及回归简介(一)
  • 体验RAG GitHub/wow-rag
  • 前端同学,你能不能别再往后端传一个巨大的JSON了?
  • 引用(C++)
  • python的微竞网咖管理系统
  • ⽂本预处理(一)
  • volatile 关键字
  • Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)
  • DO,VO,DTO.....
  • (二十四)-java+ selenium自动化测试-三大延时等待