• Lv0
    粉丝0

积分5 / 贡献0

提问3答案被采纳0文章0

napi导出类生命周期结束后未自动释放问题

charleeyang 显示全部楼层 发表于 2024-8-12 17:08:47

【问题描述】

/**
*参考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

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论2

深开鸿_王石

沙发 发表于 2024-8-12 20:40:45
如果需要在c层和js层共享个对象,然后还想通过ref来确保引用计数,那就可以用napi_create_reference,napi_delete_reference

charleeyang

发表于 2024-8-13 19:22  IP属地: 湖北省

回复 深开鸿_王石: 感谢王总回复!这个问题我们已经解决掉了,并拷机验证中!解决方案如您所讲,确实是通过c/js共享对象,并通过引用方式来实现的!

【1 条回复】

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部