OpenHarmony开发者论坛
标题:
napi导出类生命周期结束后未自动释放问题
[打印本页]
作者:
charleeyang
时间:
2024-8-12 17:08
标题:
napi导出类生命周期结束后未自动释放问题
[md]### 【问题描述】
```c++
/**
*参考ohos现有camera_work的CameraSizeNapi实现了一个自定义的对象
*foundation/multimedia/camera_framework/interfaces/kits/js/camera_napi/include/input/camera_size_napi.h
*/
class GDVFrameNapi
{
public:
static napi_value Init(napi_env env, napi_value exports);
static napi_value CreateGDVFrame(napi_env env, GDFrameData &frame);
static napi_value GetGDVFrameWidth(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameHeight(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameLength(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameFmt(napi_env env, napi_callback_info info);
static napi_value GetGDVFramePts(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameId(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameData(napi_env env, napi_callback_info info);
static napi_value GetGDVFrameCameraId(napi_env env, napi_callback_info info);
static bool ParseGDVFrameFromNapi(napi_env env, napi_value root, GDFrameData & option);
GDVFrameNapi();
~GDVFrameNapi();
GDFrameData* data_;
private:
static void GDVFrameNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint);
static napi_value GDVFrameNapiConstructor(napi_env env, napi_callback_info info);
napi_env env_;
napi_ref wrapper_;
static thread_local napi_ref sConstructor_;
static thread_local GDFrameData* sData_;
};
```
ArkTs回调函数:
```
onFrameDataCallback(frameData: gd.GDVFrame) : void
```
调用流程:
1)ArkTs注册回调到C++,c++调用 `napi_create_threadsafe_function`创建安全函数;
2)收到c++帧回调 `napi_call_threadsafe_function`/`napi_tsfn_nonblocking`调用安全函数;
3)安全函数内调用 `napi_call_function`
4)ArkTs回调onFrameDataCallback可以正常收到回调视频帧;
问题描述:
**利用CreateGDVFrame创建的对象生命周期结束后,永远无法调到GDVFrameNapiDestructor函数,并导致内存疯涨,最后出现Memory reach limit,直接被系统给杀掉。**
**咨询下相关领域同行,通过C++创建的napi类,应该怎么触发内存回收?**
### 【运行环境】
硬件:rk3568
ROM版本:
DevEvoStudio版本:
SDK版本:api 10
[/md]
作者:
深开鸿_王石
时间:
2024-8-12 20:40
如果需要在c层和js层共享个对象,然后还想通过ref来确保引用计数,那就可以用napi_create_reference,napi_delete_reference
作者:
charleeyang
时间:
2024-8-13 19:22
回复
深开鸿_王石
: 感谢王总回复!这个问题我们已经解决掉了,并拷机验证中!解决方案如您所讲,确实是通过c/js共享对象,并通过引用方式来实现的!
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5