From c8325488a765fa49850108bdaefa1a341c1c1c6a Mon Sep 17 00:00:00 2001 From: liujia178 Date: Fri, 18 Jul 2025 10:52:08 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E4=BC=98=E5=8C=96=20arkts1.2=20hilo?= =?UTF-8?q?g=20=E6=8E=A5=E5=8F=A3=E6=97=B6=E5=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liujia178 Change-Id: I9cdafe3d9c0de5ec8d3c14e54754305e6dcedbf4 --- interfaces/ets/ani/hilog/ets/@ohos.hilog.ets | 10 +-- interfaces/ets/ani/hilog/include/ani_util.h | 3 +- interfaces/ets/ani/hilog/src/ani_util.cpp | 69 ++++++++++++++++--- interfaces/ets/ani/hilog/src/hilog_ani.cpp | 4 ++ .../ets/ani/hilog/src/hilog_ani_base.cpp | 2 +- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets b/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets index eb237b6..5f69342 100644 --- a/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets +++ b/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets @@ -17,19 +17,19 @@ export default namespace hilog { loadLibrary("hilog_ani"); export native function debug(domain: number, tag: string, format: string, - ...args: (int|boolean|number|string|bigint|Object|undefined|null)[]): void; + ...args: (Object | undefined| null)[]): void; export native function info(domain: number, tag: string, format: string, - ...args: (int|boolean|number|string|bigint|Object|undefined|null)[]): void; + ...args: (Object | undefined | null)[]): void; export native function warn(domain: number, tag: string, format: string, - ...args: (int|boolean|number|string|bigint|Object|undefined|null)[]): void; + ...args: (Object | undefined | null)[]): void; export native function error(domain: number, tag: string, format: string, - ...args: (int|boolean|number|string|bigint|Object|undefined|null)[]): void; + ...args: (Object | undefined | null)[]): void; export native function fatal(domain: number, tag: string, format: string, - ...args: (int|boolean|number|string|bigint|Object|undefined|null)[]): void; + ...args: (Object | undefined | null)[]): void; export native function isLoggable(domain: number, tag: string, level: LogLevel): boolean; diff --git a/interfaces/ets/ani/hilog/include/ani_util.h b/interfaces/ets/ani/hilog/include/ani_util.h index d136c27..2d4e26a 100644 --- a/interfaces/ets/ani/hilog/include/ani_util.h +++ b/interfaces/ets/ani/hilog/include/ani_util.h @@ -40,7 +40,8 @@ public: static AniArgsType AniArgGetType(ani_env *env, ani_object element); static bool AniEnumToInt32(ani_env *env, ani_enum_item enumItem, int32_t &value); static std::string AniStringToStdString(ani_env *env, ani_string aniStr); - static std::string AniArgToString(ani_env *env, ani_object arg); + static std::string AniArgToString(ani_env *env, ani_object arg, AniArgsType type); + static bool InitClassAndMethod(ani_env *env); }; } // namespace HiviewDFX } // namespace OHOS diff --git a/interfaces/ets/ani/hilog/src/ani_util.cpp b/interfaces/ets/ani/hilog/src/ani_util.cpp index 2d86a83..3f2ecc6 100644 --- a/interfaces/ets/ani/hilog/src/ani_util.cpp +++ b/interfaces/ets/ani/hilog/src/ani_util.cpp @@ -14,7 +14,7 @@ */ #include -#include +#include #include "hilog/log.h" #include "hilog/log_c.h" #include "hilog/log_cpp.h" @@ -43,6 +43,57 @@ const std::pair OBJECT_TYPE[] = { {CLASS_NAME_OBJECT, AniArgsType::ANI_OBJECT}, }; +static std::map TOSTRING_MAP = { + {AniArgsType::ANI_INT, nullptr}, + {AniArgsType::ANI_BOOLEAN, nullptr}, + {AniArgsType::ANI_NUMBER, nullptr}, + {AniArgsType::ANI_STRING, nullptr}, + {AniArgsType::ANI_OBJECT, nullptr}, +}; + +static std::map CLASS_MAP = { + {AniArgsType::ANI_INT, nullptr}, + {AniArgsType::ANI_BOOLEAN, nullptr}, + {AniArgsType::ANI_NUMBER, nullptr}, + {AniArgsType::ANI_STRING, nullptr}, + {AniArgsType::ANI_BIGINT, nullptr}, + {AniArgsType::ANI_OBJECT, nullptr}, +}; + +static ani_method FindToStringMethod(ani_env *env, const char* className) +{ + ani_method toStringMethod = nullptr; + if (toStringMethod == nullptr) { + ani_class cls = nullptr; + if (env->FindClass(className, &cls)) { + return nullptr; + } + if (ANI_OK != env->Class_FindMethod(cls, FUNCTION_TOSTRING, MANGLING_TOSTRING, &toStringMethod)) { + return nullptr; + } + } + return toStringMethod; +} + +bool AniUtil::InitClassAndMethod(ani_env *env) +{ + for (const auto &objType : OBJECT_TYPE) { + ani_class cls = nullptr; + ani_ref globalClassRef = nullptr; + if (ANI_OK != env->FindClass(objType.first, &cls) || + ANI_OK != env->GlobalReference_Create(cls, &globalClassRef)) { + return false; + } + CLASS_MAP[objType.second] = globalClassRef; + } + TOSTRING_MAP[AniArgsType::ANI_INT] = FindToStringMethod(env, CLASS_NAME_INT); + TOSTRING_MAP[AniArgsType::ANI_BOOLEAN] = FindToStringMethod(env, CLASS_NAME_BOOLEAN); + TOSTRING_MAP[AniArgsType::ANI_NUMBER] = FindToStringMethod(env, CLASS_NAME_DOUBLE); + TOSTRING_MAP[AniArgsType::ANI_BIGINT] = FindToStringMethod(env, CLASS_NAME_BIGINT); + TOSTRING_MAP[AniArgsType::ANI_OBJECT] = FindToStringMethod(env, CLASS_NAME_OBJECT); + return true; +} + bool AniUtil::IsRefUndefined(ani_env *env, ani_ref ref) { ani_boolean isUndefined = ANI_FALSE; @@ -68,12 +119,8 @@ AniArgsType AniUtil::AniArgGetType(ani_env *env, ani_object element) } for (const auto &objType : OBJECT_TYPE) { - ani_class cls {}; - if (ANI_OK != env->FindClass(objType.first, &cls)) { - continue; - } ani_boolean isInstance = false; - if (ANI_OK != env->Object_InstanceOf(element, cls, &isInstance)) { + if (ANI_OK != env->Object_InstanceOf(element, static_cast(CLASS_MAP[objType.second]), &isInstance)) { continue; } if (static_cast(isInstance)) { @@ -106,11 +153,13 @@ std::string AniUtil::AniStringToStdString(ani_env *env, ani_string aniStr) return std::string(utf8Buffer); } -std::string AniUtil::AniArgToString(ani_env *env, ani_object arg) +std::string AniUtil::AniArgToString(ani_env *env, ani_object arg, AniArgsType type) { - ani_ref argStrRef {}; - if (ANI_OK != env->Object_CallMethodByName_Ref(arg, FUNCTION_TOSTRING, MANGLING_TOSTRING, &argStrRef)) { - HiLog::Info(LABEL, "Call ets method toString() failed."); + ani_ref argStrRef = nullptr; + if (type == AniArgsType::ANI_STRING) { + argStrRef = static_cast(arg); + } else if (ANI_OK != env->Object_CallMethod_Ref(arg, TOSTRING_MAP[type], &argStrRef)) { + HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNCTION_TOSTRING); return ""; } return AniStringToStdString(env, static_cast(argStrRef)); diff --git a/interfaces/ets/ani/hilog/src/hilog_ani.cpp b/interfaces/ets/ani/hilog/src/hilog_ani.cpp index 6bb1662..6e9d0f7 100644 --- a/interfaces/ets/ani/hilog/src/hilog_ani.cpp +++ b/interfaces/ets/ani/hilog/src/hilog_ani.cpp @@ -16,6 +16,7 @@ #include #include #include +#include "ani_util.h" #include "hilog_ani_base.h" using namespace OHOS::HiviewDFX; @@ -46,6 +47,9 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) return ANI_ERROR; }; + if (!AniUtil::InitClassAndMethod(env)) { + return ANI_ERROR; + } *result = ANI_VERSION_1; return ANI_OK; } diff --git a/interfaces/ets/ani/hilog/src/hilog_ani_base.cpp b/interfaces/ets/ani/hilog/src/hilog_ani_base.cpp index e473023..c20eff1 100644 --- a/interfaces/ets/ani/hilog/src/hilog_ani_base.cpp +++ b/interfaces/ets/ani/hilog/src/hilog_ani_base.cpp @@ -172,7 +172,7 @@ void HilogAniBase::parseAniValue(ani_env *env, ani_ref element, std::vector(element)); + res.val = AniUtil::AniArgToString(env, static_cast(element), type); } else { HiLog::Info(LABEL, "%{public}s", "Type mismatch"); } -- Gitee