HarmonyOS 鸿蒙Next NDK开发,如何读取不定长的字符串

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next NDK开发,如何读取不定长的字符串

NAPI_EXTERN napi_status napi_get_value_string_utf8(napi_env env,
napi_value value,
char* buf,
size_t bufsize,
size_t* result);

在NDK开发中,使用这个api读取上层传入的字符串,但是需要传一个bufsize。我遇到的问题是,上层传入的字符串长度是不定的(长度可能是100,也可能是2000),而在C层,我需要先创建一个定长数组,而数组的长度如果选择的过长,那么在app运行时会产生内存浪费,过短又会导致接收不到完整的字符串,请问有好的方案解决这个问题吗?

2 回复

可以使用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); // 获取字符串
// ...
}

在HarmonyOS鸿蒙Next NDK开发中,读取不定长的字符串通常涉及从某个数据源(如文件、网络流或设备接口)中动态获取数据。以下是一个基本的处理思路:

  1. 预分配缓冲区:首先,根据预估的最大长度预分配一个字符数组作为缓冲区。

  2. 循环读取:使用适当的读取函数(如freadrecv等),在循环中逐步读取数据到缓冲区中,同时维护一个计数器来跟踪当前已读取的字符数。

  3. 动态扩展:如果达到预分配缓冲区的限制且数据仍未读完,需要重新分配更大的缓冲区,并将已读数据复制到新缓冲区中,继续读取剩余数据。

  4. 字符串终结:在读取结束后,确保缓冲区末尾有一个空字符('\0')来标记字符串的结束。

  5. 错误处理:检查每次读取操作的返回值,处理可能的错误,如文件结束(EOF)、网络中断等。

示例代码(伪代码):

char *buffer = malloc(INITIAL_SIZE);
size_t bytesRead, totalBytes = 0;
while ((bytesRead = fread(...)) > 0) {
    if (totalBytes + bytesRead >= INITIAL_SIZE) {
        char *newBuffer = realloc(buffer, newSize);
        // 处理realloc失败的情况
        ...
        buffer = newBuffer;
    }
    memcpy(buffer + totalBytes, dataReadPointer, bytesRead);
    totalBytes += bytesRead;
}
buffer[totalBytes] = '\0';

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部