diff --git a/adapter/ohos/build/BUILD.gn b/adapter/ohos/build/BUILD.gn index b70e40698a6e0dd91128a4cc5d994a03899588d5..b5e349a3cd5ff415f340b778d7a1e1130e797bd2 100644 --- a/adapter/ohos/build/BUILD.gn +++ b/adapter/ohos/build/BUILD.gn @@ -31,6 +31,7 @@ group("ace_packages") { "$ace_root/interfaces/inner_api/ace:ace_uicontent", "$ace_root/interfaces/napi/kits:napi_group", "$ace_root/interfaces/native:ace_packages_ndk", + "$ace_root/frameworks/bridge/arkts_frontend:arkts_frontend", ] if (is_asan) { diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 0c7f590e6c37203469d75f7772f370fbbfc5416e..fc1f3973668a6a5855c9449598cbe5bda7553151 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -54,6 +54,7 @@ #include "bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h" #include "bridge/js_frontend/js_frontend.h" #include "bridge/arkts_frontend/arkts_frontend.h" +#include "bridge/arkts_frontend/arkts_frontend_helper.h" #include "core/common/ace_application_info.h" #include "core/common/ace_engine.h" #include "core/common/plugin_manager.h" @@ -650,7 +651,12 @@ void AceContainer::InitializeFrontend() return; } } else if (type_ == FrontendType::ARK_TS) { - frontend_ = MakeRefPtr(sharedRuntime_); + auto arkts_frontend = ArktsFrontendHelper::GetInstance().CreatArkTsFrontend(sharedRuntime_); + if (arkts_frontend == nullptr) { + LOGE("Create arkts frontend failed."); + return; + } + frontend_ = AceType::Claim(reinterpret_cast(arkts_frontend)); } else { LOGE("Frontend type not supported"); EventReport::SendAppStartException(AppStartExcepType::FRONTEND_TYPE_ERR); @@ -2451,12 +2457,7 @@ void AceContainer::SetAniLocalStorage(void* storage, const std::shared_ptr(sp); - if (!arktsFrontend) { - ReleaseStorageReference(sharedRuntime, storage); - return; - } - arktsFrontend->RegisterLocalStorage(id, storage); + sp->RegisterLocalStorage(id, storage); }, TaskExecutor::TaskType::UI, "ArkUISetAniLocalStorage"); } diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 24a9a068a55b3bda1bd967df70fb0b4590417572..ca56bb4bd3b062cfa43106bc69af2d852f1288fe 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -103,7 +103,6 @@ #include "base/perfmonitor/perf_monitor.h" #include "base/subwindow/subwindow_manager.h" #include "base/utils/system_properties.h" -#include "bridge/arkts_frontend/arkts_frontend.h" #include "bridge/card_frontend/form_frontend_declarative.h" #include "core/common/ace_engine.h" #include "core/common/asset_manager_impl.h" @@ -128,6 +127,7 @@ #include "core/components_ng/render/adapter/rosen_render_context.h" #include "core/image/image_file_cache.h" #include "core/pipeline_ng/pipeline_context.h" +#include "bridge/arkts_frontend/arkts_frontend_helper.h" #ifdef FORM_SUPPORTED #include "core/common/form_manager.h" #endif @@ -1425,10 +1425,9 @@ ani_object UIContentImpl::GetUIAniContext() ContainerScope scope(instanceId_); ani_object result = nullptr; auto frontend = container->GetFrontend(); - CHECK_NULL_RETURN(frontend, result); - auto arktsFrontend = AceType::DynamicCast(frontend); - CHECK_NULL_RETURN(arktsFrontend, result); - result = arktsFrontend->CallGetUIContextFunc(); + CHECK_NULL_RETURN(frontend, nullptr); + result = static_cast(frontend->CallGetUIContextFunc()); + CHECK_NULL_RETURN(result, nullptr); return result; } diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index b128821c08a3a15b52276a40866fc9d3de1e6b38..a58ab773bf3f49ae7a77632f762f5a979f1e943a 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -85,7 +85,7 @@ public: void AddParentContainerId(int32_t containerId, int32_t parentContainerId); void RemoveParentContainerId(int32_t containerId); - int32_t GetParentContainerId(int32_t containerId); + ACE_FORCE_EXPORT int32_t GetParentContainerId(int32_t containerId); int32_t GetSubContainerId(int32_t parentContainerId); const std::vector GetAllSubContainerId(int32_t parentContainerId); diff --git a/frameworks/bridge/BUILD.gn b/frameworks/bridge/BUILD.gn index 81b0e47f5a6d62534f30aae421fa160490316110..c19819267c72d32b1f3b3cdba53a1a5acf299219 100644 --- a/frameworks/bridge/BUILD.gn +++ b/frameworks/bridge/BUILD.gn @@ -34,7 +34,6 @@ template("framework_bridge") { "declarative_frontend:declarative_frontend_$platform", # bridge source - "arkts_frontend:arkts_frontend", "card_frontend:card_frontend_$platform", "codec:data_codec", "common:bridge_common_$platform", @@ -43,10 +42,6 @@ template("framework_bridge") { "plugin_frontend:plugin_frontend_$platform", ] - if (build_ohos_sdk || is_arkui_x) { - deps -= [ "arkts_frontend:arkts_frontend" ] - } - if (defined(config.js_pa_support) && config.js_pa_support) { deps += [ "$ace_root/${config.pa_engine_path}:pa_backend_$platform" ] } @@ -73,15 +68,11 @@ template("framework_bridge_ng") { configs = [ "$ace_root:ace_config" ] deps = [ - "arkts_frontend:arkts_frontend", "codec:data_codec", "common:bridge_common_ng_$platform", "common/accessibility:bridge_accessibility_$platform", "declarative_frontend:declarative_frontend_$platform", ] - if (is_arkui_x) { - deps -= [ "arkts_frontend:arkts_frontend" ] - } if (defined(config.js_pa_support) && config.js_pa_support) { deps += [ "$ace_root/${config.pa_engine_path}:pa_backend_$platform" ] } diff --git a/frameworks/bridge/arkts_frontend/BUILD.gn b/frameworks/bridge/arkts_frontend/BUILD.gn index 7ebc64e2510a8814f81bf065886da162a746ca74..5760965799f0b70c4a454d6386d11d1291a66922 100644 --- a/frameworks/bridge/arkts_frontend/BUILD.gn +++ b/frameworks/bridge/arkts_frontend/BUILD.gn @@ -13,13 +13,14 @@ import("//foundation/arkui/ace_engine/ace_config.gni") -ohos_source_set("arkts_frontend") { +ohos_shared_library("arkts_frontend") { subsystem_name = ace_engine_subsystem part_name = ace_engine_part configs = [ "$ace_root:ace_config" ] deps = [ ":ArkoalaNative_ark", "arkoala:arkoala_prebuild", + "$ace_root/build:libace_compatible", ] if (build_ohos_sdk) { diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp index f2c787e4d5b3641630dc110839f9e36d1b01432a..8754b2897366934ba02a985ed520a7b35181084e 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp @@ -245,7 +245,7 @@ void ArktsFrontend::Destroy() env_->GlobalReference_Delete(app_); } -ani_object ArktsFrontend::CallGetUIContextFunc() +void* ArktsFrontend::CallGetUIContextFunc() { ani_object result = nullptr; ani_status status; @@ -265,6 +265,14 @@ ani_object ArktsFrontend::CallGetUIContextFunc() LOGE("New UIContext object failed, %{public}d", status); return result; } - return result; + return static_cast(result); +} + +extern "C" ACE_FORCE_EXPORT void* CreateArktsFrontend(void* runtime) { + if (!runtime) { + LOGE("runtime is nullptr."); + return nullptr; + } + return static_cast(new ArktsFrontend(runtime)); } } // namespace OHOS::Ace diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.h b/frameworks/bridge/arkts_frontend/arkts_frontend.h index b612d7a7e7cf067e182519c6795ccf2c3bb5f2f6..c327ec4c889dbbbdea99043c26b6a174e0ca7389 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.h +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.h @@ -238,16 +238,6 @@ public: void FlushReload() override {} void HotReload() override {} - void RegisterLocalStorage(int32_t id, void* storage) - { - storageMap_.emplace(id, storage); - } - - void UnRegisterLocalStorage(int32_t id) - { - storageMap_.erase(id); - } - void* GetShared(int32_t id); void RegisterLayoutInspectorCallback(const RefPtr& layoutFunc, const std::string& componentId) @@ -270,7 +260,7 @@ public: drawCallbacks_.erase(componentId); } - ani_object CallGetUIContextFunc(); + void* CallGetUIContextFunc() override; bool IsDrawChildrenCallbackFuncExist(const std::string& componentId) override { return false; } void OnDrawChildrenCompleted(const std::string& componentId) override {} @@ -281,8 +271,6 @@ private: ani_ref app_; bool foregroundFrontend_ = false; - std::unordered_map storageMap_; - ACE_DISALLOW_COPY_AND_MOVE(ArktsFrontend); std::map> layoutCallbacks_; diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h b/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h new file mode 100644 index 0000000000000000000000000000000000000000..fcdca9a5c0af4df24cfc7e9b6ec02e775c9cb61f --- /dev/null +++ b/frameworks/bridge/arkts_frontend/arkts_frontend_helper.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H +#define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H + +#include +#include +#include +#include + +#include "interfaces/inner_api/ace/utils.h" +#include "base/utils/macros.h" +#include "base/utils/noncopyable.h" + +namespace OHOS::Ace { +using ArkTsFrontendHandle = void*; +using CreateArktsFrontendFunc = void* (*)(const void*); +using GetANIContextFunc = void* (*)(const void*); + +const std::string ARKTS_FRONTEND_LIB = "libarkts_frontend.z.so"; +const std::string CREATE_FRONTEND = "CreatArkTsFrontend"; + +class ACE_EXPORT ArktsFrontendHelper final { +public: + static ArktsFrontendHelper& GetInstance() + { + static ArktsFrontendHelper instance; + return instance; + } + void* CreatArkTsFrontend(void* sharedRuntime) + { + if (!createArktsFrontendFunc_) { + createArktsFrontendFunc_ = + reinterpret_cast(LoadSymbol(CREATE_FRONTEND.c_str())); + } + + CHECK_NULL_RETURN(createArktsFrontendFunc_, nullptr); + return createArktsFrontendFunc_(sharedRuntime); + } +private: + ArktsFrontendHelper() { + DynamicLoadLibrary(); + } + + ~ArktsFrontendHelper() + { + CloseLibrary(); + } + + bool DynamicLoadLibrary() + { + if (!arkTsFrontendHandle_) { + arkTsFrontendHandle_ = dlopen(ARKTS_FRONTEND_LIB.c_str(), RTLD_LAZY); + CHECK_NULL_RETURN(arkTsFrontendHandle_, false); + } + return true; + } + void CloseLibrary() + { + if (dlclose(arkTsFrontendHandle_) != 0) { + return; + } + arkTsFrontendHandle_ = nullptr; + createArktsFrontendFunc_ = nullptr; + } + void* LoadSymbol(const char* symName) + { + CHECK_NULL_RETURN(arkTsFrontendHandle_, nullptr); + return dlsym(arkTsFrontendHandle_, symName); + } + + ArkTsFrontendHandle arkTsFrontendHandle_ = nullptr; + CreateArktsFrontendFunc createArktsFrontendFunc_ = nullptr; +}; +} // namespace OHOS::Ace +#endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ARKTS_FRONTEND_ARKTS_FRONTEND_HELPER_H diff --git a/frameworks/core/common/frontend.h b/frameworks/core/common/frontend.h index 8f31fdd01b247c5474831708bff7eebced136968..57b67cf80f9c58d82d1021ca25bd839ce318adf6 100644 --- a/frameworks/core/common/frontend.h +++ b/frameworks/core/common/frontend.h @@ -360,6 +360,21 @@ public: return ""; } + virtual void RegisterLocalStorage(int32_t id, void* storage) + { + storageMap_.emplace(id, storage); + } + + void UnRegisterLocalStorage(int32_t id) + { + storageMap_.erase(id); + } + + virtual void* CallGetUIContextFunc() + { + return nullptr; + } + protected: virtual bool MaybeRelease() override; FrontendType type_ = FrontendType::JS; @@ -369,6 +384,7 @@ protected: State state_ = State::UNDEFINE; mutable std::recursive_mutex mutex_; mutable std::mutex destructMutex_; + std::unordered_map storageMap_; }; } // namespace OHOS::Ace