在Native侧如何处理ArkTS侧传入的字符串被截断的异常场景

获取ArkTS侧传入的字符串到char[]数组时,字符串未完整获取,只获取到一部分。

HarmonyOS
2024-03-19 16:08:59
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
牙膏只用咸的

原因一: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; 
}
分享
微博
QQ
微信
回复
2024-03-19 23:40:50
相关问题
Native释放ArkTS对象方法
356浏览 • 1回复 待解决
arktshashmap转为native
877浏览 • 1回复 待解决
Native调用ArkTS全局普通方法
826浏览 • 1回复 待解决
ArkTSNative分别如何动态加载SO库
2350浏览 • 1回复 待解决
ArkTSNative如何进行map数据交互
2130浏览 • 1回复 待解决
如何Native释放ArkTS对象
2260浏览 • 1回复 待解决
Native调用ArkTS类函数
870浏览 • 1回复 待解决
HarmonyOS 字符串显示异常
349浏览 • 1回复 待解决
Web组件接收超长字符串时会被截断
152浏览 • 1回复 待解决
关于字符串分割和重组处理
4203浏览 • 1回复 待解决
HarmonyOS 字符串格式化异常
271浏览 • 1回复 待解决
Native进行跨模块加载
729浏览 • 1回复 待解决
如何Native构建一个ArkTS对象
2029浏览 • 1回复 待解决
nativelog获取不到
1560浏览 • 1回复 待解决
TS如何批量传递函数到native
863浏览 • 1回复 待解决
ArkTS如何实现字符串编解码
2614浏览 • 1回复 待解决