当前位置: 首页 > 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.xdnf.cn/news/1123651.html

相关文章:

  • 修改主机名颜色脚本
  • 虚拟货币交易:游走在合法与犯罪的生死线
  • 在Adobe Substance 3D Painter中,已经有基础图层,如何新建一个图层A,clone基础图层的纹理和内容到A图层
  • Java:继承和多态(必会知识点整理)
  • 【React Natve】NetworkError 和 TouchableOpacity 组件
  • Python 基础语法2:组合数据类型、异常
  • 【深度学习框架终极PK】TensorFlow/PyTorch/MindSpore深度解析!选对框架效率翻倍
  • JavaScript中Object.defineProperty的作用和用法以及和proxy的区别
  • SSM框架学习——day1
  • Datawhale AI夏令营-基于带货视频评论的用户洞察挑战赛
  • AI Linux 运维笔记
  • Imx6ull用网线与电脑连接
  • 使用 pytest 测试框架构建自动化测试套件之一
  • ethers.js-5–和solidity的关系
  • pytorch学习1(DataSet+Transforms+TensorBoard)
  • LeetCode 692题解 | 前K个高频单词
  • 工业软件加密锁复制:一场技术与安全的博弈
  • Lovable - AI 驱动的全栈应用开发平台
  • PyTorch张量(Tensor)创建的方式汇总详解和代码示例
  • [笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层
  • Linux:1_Linux下基本指令
  • TCP心跳机制详解
  • 使用axios向服务器请求信息并渲染页面
  • 如何在服务器上运行一个github项目
  • K8S的平台核心架构思想[面向抽象编程]
  • docker私有仓库
  • Ai问答之空间站星等
  • 【科研绘图系列】R语言绘制世界地图
  • C++ 中常见的字符串定义方式及其用法
  • 使用Java完成下面项目