修复context转换

Signed-off-by: zhang_hao_zheng <zhanghaozheng2@h-partners.com>
Change-Id: I1ce9bb7bf367196b8a6eb4c693cd54f493f0f47b
This commit is contained in:
zhang_hao_zheng
2025-11-03 17:23:06 +08:00
parent 4138c2ccc3
commit bedff02fa8
6 changed files with 35 additions and 32 deletions
@@ -135,18 +135,12 @@ ani_object ETSStartupManager::NativeGetStartupTaskResult(ani_env *env, ani_strin
EtsErrorUtil::ThrowInvalidParamError(env, "Parameter error: Failed to get result");
return nullptr;
}
if (result->GetResultType() != StartupTaskResult::ResultType::ETS) {
TAG_LOGE(AAFwkTag::STARTUP, "result type not ets");
EtsErrorUtil::ThrowInvalidParamError(env, "Parameter error: result type not ets");
return nullptr;
}
std::shared_ptr<EtsStartupTaskResult> etsResult = std::static_pointer_cast<EtsStartupTaskResult>(result);
if (etsResult == nullptr) {
ani_ref etsResultRef = StartupTaskUtils::GetDependencyResult(env, result);
if (etsResultRef == nullptr) {
TAG_LOGE(AAFwkTag::STARTUP, "ets result is null");
EtsErrorUtil::ThrowInvalidParamError(env, "Parameter error: ets result is null");
return nullptr;
}
ani_ref etsResultRef = etsResult->GetEtsStartupResultRef();
return reinterpret_cast<ani_object>(etsResultRef);
}
@@ -18,6 +18,7 @@
#include "ets_startup_task.h"
#include "hilog_tag_wrapper.h"
#include "stage_context_transfer.h"
#include "startup_task_utils.h"
namespace OHOS {
namespace AbilityRuntime {
@@ -63,5 +64,23 @@ void StartupTaskUtils::UpdateStartupTaskContextRef(napi_env env, std::shared_ptr
TAG_LOGW(AAFwkTag::STARTUP, "Unknown startup task type: %{public}s", startupTask->GetType().c_str());
}
}
ani_ref StartupTaskUtils::GetDependencyResult(ani_env *env, std::shared_ptr<StartupTaskResult> result)
{
if (result == nullptr) {
return nullptr;
}
if (result->GetResultType() == StartupTaskResult::ResultType::ETS) {
std::shared_ptr<EtsStartupTaskResult> etsResultPtr = std::static_pointer_cast<EtsStartupTaskResult>(result);
return etsResultPtr->GetEtsStartupResultRef();
}
if (result->GetResultType() == StartupTaskResult::ResultType::JS) {
std::shared_ptr<JsStartupTaskResult> jsResultPtr = std::static_pointer_cast<JsStartupTaskResult>(result);
auto resultObj = EtsStartupTaskResult::JsToEtsResult(env, jsResultPtr->GetJsStartupResultRef());
return reinterpret_cast<ani_ref>(resultObj);
}
TAG_LOGE(AAFwkTag::STARTUP, "invalid result type:%{public}d", static_cast<int32_t>(result->GetResultType()));
return nullptr;
}
} // namespace AbilityRuntime
} // namespace OHOS
@@ -20,6 +20,7 @@
#include "ets_startup_task_executor.h"
#include "hilog_tag_wrapper.h"
#include "stage_context_transfer.h"
#include "startup_task_utils.h"
#ifdef WINDOWS_PLATFORM
#define ETS_EXPORT __declspec(dllexport)
@@ -125,7 +126,7 @@ int32_t EtsStartupTask::RunTaskOnDependencyCompleted(const std::string &dependen
}
ani_string dependency = AppExecFwk::GetAniString(env, dependencyName);
ani_ref etsResult = GetDependencyResult(env, dependencyName, result);
ani_ref etsResult = StartupTaskUtils::GetDependencyResult(env, result);
ani_status status = env->Object_CallMethodByName_Void(startupObj, "onDependencyCompleted", nullptr, dependency,
etsResult);
if (status != ANI_OK) {
@@ -135,25 +136,6 @@ int32_t EtsStartupTask::RunTaskOnDependencyCompleted(const std::string &dependen
return ERR_OK;
}
ani_ref EtsStartupTask::GetDependencyResult(ani_env *env, const std::string &dependencyName,
std::shared_ptr<StartupTaskResult> result)
{
if (result == nullptr) {
return nullptr;
}
if (result->GetResultType() == StartupTaskResult::ResultType::ETS) {
std::shared_ptr<EtsStartupTaskResult> etsResultPtr = std::static_pointer_cast<EtsStartupTaskResult>(result);
return etsResultPtr->GetEtsStartupResultRef();
}
if (result->GetResultType() == StartupTaskResult::ResultType::JS) {
std::shared_ptr<JsStartupTaskResult> jsResultPtr = std::static_pointer_cast<JsStartupTaskResult>(result);
auto resultObj = EtsStartupTaskResult::JsToEtsResult(env, jsResultPtr->GetJsStartupResultRef());
return reinterpret_cast<ani_ref>(resultObj);
}
TAG_LOGE(AAFwkTag::STARTUP, "invalid result type:%{public}d", static_cast<int32_t>(result->GetResultType()));
return nullptr;
}
extern "C" ETS_EXPORT AppStartupTask* OHOS_CreateEtsStartupTask(
const std::unique_ptr<Runtime> &runtime, const StartupTaskInfo &info,
bool lazyLoad)
@@ -112,9 +112,17 @@ ani_object EtsStartupTaskResult::JsToEtsResult(ani_env *aniEnv, std::shared_ptr<
arkts_napi_scope_close_n(napiEnv, 0, nullptr, nullptr);
return nullptr;
}
ani_ref unwrapResult = nullptr;
ani_status status = aniEnv->Object_CallMethodByName_Ref(result, "unwrap", ":Lstd/core/Object;", &unwrapResult);
if (status != ANI_OK) {
TAG_LOGE(AAFwkTag::STARTUP, "Object_CallMethodByName_Ref failed: %{public}d", status);
hybridgref_delete_from_napi(napiEnv, ref);
arkts_napi_scope_close_n(napiEnv, 0, nullptr, nullptr);
return nullptr;
}
hybridgref_delete_from_napi(napiEnv, ref);
arkts_napi_scope_close_n(napiEnv, 0, nullptr, nullptr);
return result;
return reinterpret_cast<ani_object>(unwrapResult);
}
const std::shared_ptr<NativeReference> EtsStartupTaskResult::GetJsStartupResultRef()
@@ -22,6 +22,7 @@
#include "app_startup_task.h"
#include "context.h"
#include "ets_native_reference.h"
#include "startup_task_result.h"
namespace OHOS {
namespace AbilityRuntime {
@@ -29,6 +30,8 @@ class StartupTaskUtils {
public:
static void UpdateStartupTaskContextRef(napi_env env, std::shared_ptr<AppStartupTask> startupTask,
std::shared_ptr<Context> context, ani_ref contextAniRef);
static ani_ref GetDependencyResult(ani_env *env, std::shared_ptr<StartupTaskResult> result);
};
} // namespace AbilityRuntime
} // namespace OHOS
@@ -53,9 +53,6 @@ private:
bool esModule_ = true;
std::shared_ptr<StartupTaskResultCallback> resultCallback_;
static ani_ref GetDependencyResult(ani_env *env, const std::string &dependencyName,
std::shared_ptr<StartupTaskResult> result);
int32_t LoadEtsOhmUrl();
};
} // namespace AbilityRuntime