在Native侧如何精准获取ArkTS侧传入的字符串长度?

在Native侧,转换ArkTS侧的字符串到char[]数组时无法准确获取字符串长度,频繁使用NAPI_AUTO_LENGTH宏定义会增加内存开销,影响性能。

阅读 4.5k
avatarAI BotBETA

如果你正在使用Native代码与ArkTS(我假设你指的是TypeScript或其他某种类型系统)进行交互,并且想要精确地获取从TypeScript侧传入的字符串长度,你通常会需要确保在传递字符串时保留其长度信息。在JavaScript或TypeScript中,字符串本质上是由UTF-16编码的字符序列,因此长度可以是任何正整数。

在Native代码中,当你从TypeScript或JavaScript接收字符串时,它通常会作为一个UTF-16编码的字符数组(或等效的字符串类型)传递。你应该能够直接查询这个数组或字符串的长度,而不需要任何特殊的宏或转换。

如果你使用的是Node.js的Native Addons(比如使用C++编写的扩展),你可以通过napi_get_value_string_utf8napi_get_value_string_latin1函数来获取字符串的UTF-8或Latin-1表示,并同时获取字符串的长度。

以下是一个简单的示例,展示了如何在Node.js的Native Addon中接收一个字符串并获取其长度:

#include <node_api.h>

napi_value GetStringLength(napi_env env, napi_callback_info info) {
  size_t argc = 1;
  napi_value argv[1];
  napi_value result;

  // 获取传入的参数
  napi_get_cb_info(env, info, &argc, argv, NULL, NULL);

  // 检查参数类型和数量
  if (argc < 1) {
    napi_throw_type_error(env, NULL, "Wrong number of arguments");
    return NULL;
  }

  // 检查参数是否为字符串
  napi_valuetype valuetype;
  napi_typeof(env, argv[0], &valuetype);
  if (valuetype != napi_string) {
    napi_throw_type_error(env, NULL, "Expected a string");
    return NULL;
  }

  // 获取字符串的UTF-8表示和长度
  size_t utf8Length;
  napi_value utf8String;
  napi_status status = napi_get_value_string_utf8(env, argv[0], NULL, 0, &utf8Length);
  if (status != napi_ok) {
    napi_throw_generic_error(env, NULL, "Failed to get string length");
    return NULL;
  }

  // 创建一个表示长度的数字并返回
  napi_create_int32(env, utf8Length, &result);
  return result;
}

napi_value Init(napi_env env, napi_value exports) {
  // 省略了错误检查和其他初始化代码
  napi_create_function(env, NULL, 0, GetStringLength, NULL, &exports);
  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

在这个例子中,GetStringLength函数接收一个字符串参数,然后使用napi_get_value_string_utf8获取其UTF-8表示和长度。然后,它创建并返回一个表示这个长度的napi_value

确保在调用napi_get_value_string_utf8时传递NULL作为第一个参数,这将仅获取字符串的长度而不实际复制字符串内容。

请注意,上面的代码是一个简化的示例,你可能需要根据你的具体环境和需求进行调整。如果你正在使用的不是Node.js的Native Addons,或者你的环境有特殊的字符串处理机制,你可能需要查阅相关文档来找到适合你的解决方案。

1 个回答

可以使用napi_get_value_string_utf8的第五个参数来获取ArkTS层传入字符串的长度。这个参数是一个指向size_t类型的变量,它会在函数调用成功后被赋值为字符串的长度,可以根据这个长度来分配合适大小的char数组。具体操作为:先调用napi_get_value_string_utf8函数来获取字符串的长度,然后根据长度分配char数组的内存空间。最后,再次调用napi_get_value_string_utf8函数来获取字符串的内容。注意,在分配内存时,可以将长度+1,以便为字符串添加终止符'\0'。

参考代码如下:

static napi_value TestFunc(napi_env env, napi_callback_info info) 
{ 
    size_t argc = 1; 
    napi_value args[1] = {nullptr}; 
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); 
     
    size_t len = 0; 
    napi_get_value_string_utf8(env, args[0], nullptr, 0, &len);    // 获取字符串长度到len 
    char* buf = new char[len+1];                                   // 分配合适大小的char数组 
    napi_get_value_string_utf8(env, args[0], buf, len + 1, &len);  // 获取字符串 
    // ... 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进