diff --git a/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets b/interfaces/ets/ani/hilog/ets/@ohos.hilog.ets index eb237b69b0e0ade8c1f4b37ef9ee4003d7d298fe..5f69342b2c2669d08f3de49e029e3e6b9848dbeb 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 d136c2727d601275ca72235c99c3474286e357cf..2d4e26a452896aa5e3fa4c3c9e99c2d462ea6c23 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 2d86a835c7646a4ee88e04a0d00518d7dfc53b8b..3f2ecc6bd7bc12ce493f26bc77e93905ce6e0e14 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 6bb16621b9b939f82fa4a0f824e9fde7f894ffc5..6e9d0f7bd5f803aed669dc859d784e8bfbf93924 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 e4730236bae37ef95b2731c88afebf5483cd35e3..c20eff143d6a35e93afcd1ac1ddea5ad5bf38ef3 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"); }