问题现象
获取ArkTS侧传入的字符串到char[]数组时,字符串未完整获取,只获取到一部分。
可能原因
原因一:char数组长度不足。
原因二:使用接口napi_get_value_string_utf8()获取字符串时,第四个参数数值太小,没超过传入的字符串长度。
解决措施
假设info中存储的ArkTS侧参数为“abcdefghigk”。
原因一:char数组长度不足。
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;
char buf[5]; // 分配长度为5的char数组
napi_get_value_string_utf8(env, args[0], buf, 1024, &len); // 获取字符串,buf结果为"abcde"
// ...
}
设置char数组长度为5,字符串被截断:buf为"abcde"。
原因二:使用接口napi_get_value_string_utf8()获取字符串时,第四个参数数值太小,没超过传入的字符串长度。
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;
char buf[1024];
napi_get_value_string_utf8(env, args[0], buf, 5, &len); // 获取字符串,buf最终结果为"abcd"
// ...
}
设置第四个参数值为5,字符串被截断:buf为"abcd",终止符’\0’占一位。
保证char数组长度大于等于字符串本身长度,并且接口napi_get_value_string_utf8()获取字符串时,第四个参数数值够用。先调用napi_get_value_string_utf8函数来获取字符串的长度,然后根据长度动态分配char数组的内存空间。注意,我们在分配内存时,可以将长度+1,以便为字符串添加终止符’\0’。
参考代码如下:
napi_value Test::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); // 获取字符串
OH_LOG_ERROR(LOG_APP, "result is: b:%{public}s.", buf);
return nullptr;
}