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

相关文章:

  • 系统化构建产品开发体系
  • androidstudio 高低版本兼容
  • 机构参与度及其Python数据获取示例
  • 迁移学习:知识复用的智能迁移引擎 | 从理论到实践的跨域赋能范式
  • 【Canvas与五星】六种五星画法
  • MIPI DSI (一) MIPI DSI 联盟概述
  • 【leetcode】231. 2的幂
  • ASP.NET Core中数据绑定原理实现详解
  • Android模块化架构:基于依赖注入和服务定位器的解耦方案
  • iOS如何查看电池容量?理解系统限制与开发者级能耗调试方法
  • H.264编解码(NAL)
  • 前端docx库实现将html页面导出word
  • 蜻蜓I即时通讯水银版系统直播功能模块二次开发文档-详细的直播功能模块文档范例-卓伊凡|麻子
  • 文档处理控件Aspose.Words教程:从 C# 中的 Word 文档中提取页面
  • 【飞牛云fnOS】告别数据孤岛:飞牛云fnOS私人资料管家
  • Python爬虫实战:研究PyMongo库相关技术
  • crawl4ai--bitcointalk爬虫实战项目
  • 嵌入式硬件篇---ne555定时器
  • 嵌入式硬件篇---晶体管的分类
  • Android 中 实现格式化字符串
  • Selenium动态网页爬虫编写与解释
  • 【Linux】Jenkins Lts 配置构建 Maven 项目
  • C++之哈希表的基本介绍以及其自我实现(开放定址法版本)
  • Maven 依赖原则和依赖冲突
  • 【Spring AI Alibaba】接入大模型
  • openGL学习(EBO)
  • Spring 学习笔记
  • 2025/7/14——java学习总结
  • JavaSE-8-多态
  • 机械硬盘文件丢失为何大概率能恢复