diff --git a/frameworks/ets/ets/BUILD.gn b/frameworks/ets/ets/BUILD.gn index 7f1e14120f..3ad1f16edb 100644 --- a/frameworks/ets/ets/BUILD.gn +++ b/frameworks/ets/ets/BUILD.gn @@ -144,6 +144,23 @@ ohos_prebuilt_etc("ability_runtime_want_constant_abc_etc") { deps = [ ":ability_runtime_want_constant_abc" ] } +generate_static_abc("ability_runtime_extension_context_abc") { + base_url = "./" + files = [ "./application/ExtensionContext.ets" ] + + is_boot_abc = "True" + device_dst_file = + "/system/framework/ability_runtime_extension_context_abc.abc" +} + +ohos_prebuilt_etc("ability_runtime_extension_context_abc_etc") { + source = "$target_out_dir/ability_runtime_extension_context_abc.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":ability_runtime_extension_context_abc" ] +} + group("ets_packages") { deps = [ ":ability_runtime_ability_constant_abc_etc", @@ -154,5 +171,6 @@ group("ets_packages") { ":ability_runtime_start_options_abc_etc", ":ability_runtime_want_abc_etc", ":ability_runtime_want_constant_abc_etc", + ":ability_runtime_extension_context_abc_etc", ] } diff --git a/frameworks/ets/ets/application/ExtensionContext.ets b/frameworks/ets/ets/application/ExtensionContext.ets index 4b6cbf0313..2d46b66d2a 100644 --- a/frameworks/ets/ets/application/ExtensionContext.ets +++ b/frameworks/ets/ets/application/ExtensionContext.ets @@ -17,9 +17,6 @@ import Context from 'application.Context' import {ExtensionAbilityInfo} from 'bundleManager.ExtensionAbilityInfo' export default class ExtensionContext extends Context { - static { - loadLibrary("context_ani"); - } extensionAbilityInfo: ExtensionAbilityInfo; native constructor(); constructor(extensionAbilityInfo: ExtensionAbilityInfo) { diff --git a/frameworks/native/ability/BUILD.gn b/frameworks/native/ability/BUILD.gn index e4f5a06ba6..e9212cdc82 100644 --- a/frameworks/native/ability/BUILD.gn +++ b/frameworks/native/ability/BUILD.gn @@ -59,6 +59,7 @@ ohos_shared_library("ability_context_native") { "ability_runtime/connection_manager.cpp", "ability_runtime/dialog_request_callback_impl.cpp", "ability_runtime/dialog_ui_extension_callback.cpp", + "ability_runtime/ets_extension_context.cpp", "ability_runtime/js_extension_context.cpp", "ability_runtime/local_call_container.cpp", "ability_runtime/local_call_record.cpp", @@ -92,6 +93,8 @@ ohos_shared_library("ability_context_native") { "image_framework:image_native", "ipc:ipc_core", "napi:ace_napi", + "runtime_core:ani", + "bundle_framework:bms_ani_common", ] public_external_deps = [ "ability_base:extractortool", diff --git a/frameworks/native/ability/ability_runtime/ets_extension_context.cpp b/frameworks/native/ability/ability_runtime/ets_extension_context.cpp new file mode 100644 index 0000000000..cdeb556cd9 --- /dev/null +++ b/frameworks/native/ability/ability_runtime/ets_extension_context.cpp @@ -0,0 +1,78 @@ +/* + * 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. + */ + +#include "ets_extension_context.h" + +#include "common_fun_ani.h" +#include "hilog_tag_wrapper.h" + +namespace OHOS { +namespace AbilityRuntime { + +bool SetExtensionAbilityInfo(ani_env *aniEnv, ani_class contextClass, ani_object contextObj, + std::shared_ptr context, std::shared_ptr abilityInfo) +{ + bool iRet = false; + if (aniEnv == nullptr || context == nullptr || abilityInfo == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "aniEnv or context or abilityInfo is nullptr"); + return iRet; + } + auto hapModuleInfo = context->GetHapModuleInfo(); + ani_status status = ANI_OK; + if (abilityInfo && hapModuleInfo) { + auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &info) { + TAG_LOGD(AAFwkTag::CONTEXT, "%{public}s, %{public}s", info.bundleName.c_str(), info.name.c_str()); + return info.bundleName == abilityInfo->bundleName && info.name == abilityInfo->name; + }; + auto infoIter = + std::find_if(hapModuleInfo->extensionInfos.begin(), hapModuleInfo->extensionInfos.end(), isExist); + if (infoIter == hapModuleInfo->extensionInfos.end()) { + TAG_LOGE(AAFwkTag::CONTEXT, "set extensionAbilityInfo fail"); + return iRet; + } + ani_field extensionAbilityInfoField; + status = aniEnv->Class_FindField(contextClass, "extensionAbilityInfo", &extensionAbilityInfoField); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); + return iRet; + } + ani_object extAbilityInfoObj = AppExecFwk::CommonFunAni::ConvertExtensionInfo(aniEnv, *infoIter); + status = aniEnv->Object_SetField_Ref( + contextObj, extensionAbilityInfoField, reinterpret_cast(extAbilityInfoObj)); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); + return iRet; + } + iRet = true; + } + return iRet; +} + +void CreatEtsExtensionContext(ani_env *aniEnv, ani_class contextClass, ani_object contextObj, + std::shared_ptr context, std::shared_ptr abilityInfo) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "CreatEtsExtensionContext Call"); + if (aniEnv == nullptr || context == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "aniEnv or context is nullptr"); + return; + } + + if (!SetExtensionAbilityInfo(aniEnv, contextClass, contextObj, context, abilityInfo)) { + TAG_LOGE(AAFwkTag::CONTEXT, "SetExtensionAbilityInfo fail"); + return; + } +} +} // namespace AbilityRuntime +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h b/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h new file mode 100644 index 0000000000..12c99e5664 --- /dev/null +++ b/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h @@ -0,0 +1,29 @@ +/* + * 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 OHOS_ABILITY_RUNTIME_STS_EXTENSION_CONTEXT_H +#define OHOS_ABILITY_RUNTIME_STS_EXTENSION_CONTEXT_H + +#include "extension_context.h" +#include "ani.h" + +namespace OHOS { +namespace AbilityRuntime { +void CreatEtsExtensionContext(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, + std::shared_ptr context, + std::shared_ptr abilityInfo); +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_STS_EXTENSION_CONTEXT_H \ No newline at end of file