NAPI创建arraybuffer内存释放问题咨询

ArkTS可以通过NAPI来调用C/C++实现的方法。

上层ArkTS定义返回的是Uint8Array类型,例如:export const getArray: () => Uint8Array;

底层NAPI在实现时,C++关键代码参考如下:

void* buffer = NULL; /* 分配数组的指针地址 /

int buffer_len = 20; / 此处20只是举例,实际并非固定,可能是从入参数据获取的长度 */

napi_value array_buffer = NULL;

napi_value result = NULL;

napi_create_arraybuffer(env, buffer_len, (void *)&buffer, &array_buffer);

/ 获取数据实现,例如:if(data_len < buffer_len) memcpy(buffer, data, data_len); */

napi_create_typedarray(env, napi_uint8_array, data_len, array_buffer, 0, &result);

return result;

问题是,由于buffer是NAPI动态分配的内存,需不需要释放内存?通过什么方式/方法来释放?或者有没有其他API替代上述napi_create_arraybuffer的实现,比如napi_create_external_arraybuffer?如果可以用napi_create_external_arraybuffer的方式,其中参数napi_finalize是在什么情况下回调的,实际调试过程中发现没有进这个回调。

HarmonyOS
6天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

napi_create_arraybuffer、napi_get_arraybuffer_info使用规则如下:

说明:

napi_create_arraybuffer接口定义:napi_create_arraybuffer(napi_env env, size_t byte_length, void** data,napi_value* result)

napi_get_arraybuffer_info接口定义:napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void** data, size_t* byte_length)

data获取的是ArrayBuffer的Buffer头指针,开发者只可以在范围内读写该Buffer区域,不可以进行释放操作。该段内存由引擎内部的ArrayBuffer Allocator管理,随JS对象ArrayBuffer的生命周期释放。

如下delete不可使用,否则,会存在双重释放:

void* arrayBufferPtr = nullptr;
napi_value arrayBuffer = nullptr;
size_t createBufferSize = ARRAYBUFFER_SIZE;
napi_status verification = napi_create_arraybuffer(env, createBufferSize, &arrayBufferPtr, &arrayBuffer);
size_t arrayBufferSize;
napi_status result = napi_get_arraybuffer_info(env, arrayBuffer, &arrayBufferPtr, &arrayBufferSize);
delete arrayBufferPtr; //这一步是禁止的,创建的arrayBufferPtr生命周期由引擎管理,不允许用户自己delete,否则会double free   

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/napi-guidelines-V5#其它

分享
微博
QQ
微信
回复
6天前
相关问题
HarmonyOS Napi Arraybuffer无法创建
104浏览 • 1回复 待解决
HarmonyOS napi_value returen后释放问题
64浏览 • 1回复 待解决
Native如何通过napi获取ArrayBuffer
3838浏览 • 1回复 待解决
HarmonyOS开发过程应用内存问题咨询
446浏览 • 1回复 待解决
HarmonyOS napi共享内存指导
86浏览 • 1回复 待解决
napi返回ArrayBuffer有长度但是内容都是0
1219浏览 • 1回复 待解决
HarmonyOS napi 接口线程安全咨询
441浏览 • 1回复 待解决
HarmonyOS eventHub创建方式咨询
226浏览 • 1回复 待解决
HarmonyOS Napi问题
87浏览 • 1回复 待解决
NAPI开发问题
98浏览 • 1回复 待解决
mapkitxiang 问题咨询
449浏览 • 1回复 待解决