From 447762da5b2103ba1700aceb342d45d177c4ccb0 Mon Sep 17 00:00:00 2001 From: s30030188 Date: Sat, 16 Aug 2025 21:50:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A8=B3=E5=AE=9A=E6=80=A7?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=BC=A0=E9=80=92=E7=9A=84=E8=B8=A9?= =?UTF-8?q?=E5=86=85=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: s30030188 --- .../napi_common_want_agent.cpp | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/frameworks/js/napi/inner/napi_wantagent_common/napi_common_want_agent.cpp b/frameworks/js/napi/inner/napi_wantagent_common/napi_common_want_agent.cpp index d8d9d79eda1..3c163b25834 100644 --- a/frameworks/js/napi/inner/napi_wantagent_common/napi_common_want_agent.cpp +++ b/frameworks/js/napi/inner/napi_wantagent_common/napi_common_want_agent.cpp @@ -44,9 +44,12 @@ napi_value AttachWantAgentFunc(napi_env env, void *value, void *) TAG_LOGI(AAFwkTag::WANTAGENT, "wantAgent not support multi thread current"); return jsObject; } - - auto wantAgent = new (std::nothrow) AbilityRuntime::WantAgent::WantAgent( - reinterpret_cast(value)->GetPendingWant()); + auto ptr = reinterpret_cast *>(value)->lock(); + if (ptr == nullptr) { + TAG_LOGI(AAFwkTag::WANTAGENT, "get wantAgent failed"); + return jsObject; + } + auto wantAgent = new (std::nothrow) std::weak_ptr(ptr); if (wantAgent == nullptr) { TAG_LOGE(AAFwkTag::WANTAGENT, "new wantAgent failed"); return jsObject; @@ -86,6 +89,12 @@ napi_value AttachWantAgentFunc(napi_env env, void *value, void *) return result; } +void DetachFinalizeWantAgent(void* detachedObject, void*) +{ + TAG_LOGD(AAFwkTag::APPKIT, "Finalizer detached ability context"); + delete static_cast *>(detachedObject); +} + napi_value WrapWantAgent(napi_env env, AbilityRuntime::WantAgent::WantAgent* wantAgent, napi_finalize finalizeCb) { TAG_LOGD(AAFwkTag::WANTAGENT, "called"); @@ -110,8 +119,9 @@ napi_value WrapWantAgent(napi_env env, AbilityRuntime::WantAgent::WantAgent* wan return nullptr; } - napi_coerce_to_native_binding_object(env, result, DetachCallbackFunc, AttachWantAgentFunc, wantAgent, nullptr); - + auto weakAgent = new (std::nothrow) std::weak_ptr(wantAgent->shared_from_this()); + napi_coerce_to_native_binding_object(env, result, DetachCallbackFunc, AttachWantAgentFunc, weakAgent, nullptr); + napi_add_detached_finalizer(env, result, DetachFinalizeWantAgent, nullptr); napi_finalize finalize = [](napi_env env, void* data, void* hint) { TAG_LOGD(AAFwkTag::WANTAGENT, "delete wantAgent"); if (data != nullptr) { @@ -124,9 +134,10 @@ napi_value WrapWantAgent(napi_env env, AbilityRuntime::WantAgent::WantAgent* wan finalize = finalizeCb; } - auto res = napi_wrap(env, result, reinterpret_cast(wantAgent), finalize, nullptr, nullptr); + auto res = napi_wrap(env, result, reinterpret_cast(weakAgent), finalize, nullptr, nullptr); if (res != napi_ok && wantAgent != nullptr) { TAG_LOGE(AAFwkTag::WANTAGENT, "napi_wrap failed:%{public}d", res); + delete weakAgent; return nullptr; } return result; -- Gitee