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