From da0b4bab6a0243796e4bb4578d915f8408458b18 Mon Sep 17 00:00:00 2001 From: liujia178 Date: Fri, 18 Jul 2025 18:07:17 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E4=BC=98=E5=8C=96hisysevent?= =?UTF-8?q?=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: Ide3cf0da135df06add67c261bf065524ab4db23c --- .../ani/hisysevent/include/hisysevent_ani.h | 10 - .../hisysevent/include/hisysevent_ani_util.h | 12 + .../ets/ani/hisysevent/src/hisysevent_ani.cpp | 40 +-- .../hisysevent/src/hisysevent_ani_util.cpp | 232 +++++++++--------- 4 files changed, 141 insertions(+), 153 deletions(-) diff --git a/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h b/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h index d6e1164..f417153 100644 --- a/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h +++ b/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h @@ -37,16 +37,6 @@ using JsCallerInfo = std::pair; enum ParamType { BL = 0, DOU, I64, U64, STR, BOOL_ARR, DOUBLE_ARR, I64_ARR, U64_ARR, STR_ARR }; -enum AniArgsType { - ANI_UNKNOWN = 0, - ANI_BOOLEAN = 1, - ANI_INT = 2, - ANI_DOUBLE = 3, - ANI_STRING = 4, - ANI_BIGINT = 5, - ANI_UNDEFINED = 6, -}; - class HiSysEventAni { public: static ani_object WriteSync(ani_env *env, ani_object info); diff --git a/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h b/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h index 8c43645..b27f46c 100644 --- a/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h +++ b/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h @@ -41,6 +41,16 @@ enum EventTypeAni : int32_t { BEHAVIOR = 4 }; +enum AniArgsType { + ANI_UNKNOWN = 0, + ANI_BOOLEAN = 1, + ANI_INT = 2, + ANI_DOUBLE = 3, + ANI_STRING = 4, + ANI_BIGINT = 5, + ANI_UNDEFINED = 6, +}; + constexpr char CLASS_NAME_INT[] = "std.core.Int"; constexpr char CLASS_NAME_BOOLEAN[] = "std.core.Boolean"; constexpr char CLASS_NAME_DOUBLE[] = "std.core.Double"; @@ -66,6 +76,8 @@ constexpr char NAME_ATTR[] = "name"; class HiSysEventAniUtil { public: + static bool InitAniClassAndMethod(ani_env *env); + static AniArgsType GetArgType(ani_env *env, ani_object elementObj); static std::string AniStringToStdString(ani_env *env, ani_string aniStr); static bool CheckKeyTypeString(const std::string &str); static bool IsArray(ani_env *env, ani_object object); diff --git a/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp b/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp index e1bc2fe..60d4abb 100644 --- a/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp +++ b/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp @@ -56,35 +56,6 @@ constexpr int LINE_INDEX = 1; constexpr char CALL_FUNC_INFO_DELIMITER = ' '; constexpr char CALL_LINE_INFO_DELIMITER = ':'; constexpr char PATH_DELIMITER = '/'; -const std::pair OBJECT_TYPE[] = { - {CLASS_NAME_BOOLEAN, AniArgsType::ANI_BOOLEAN}, - {CLASS_NAME_INT, AniArgsType::ANI_INT}, - {CLASS_NAME_DOUBLE, AniArgsType::ANI_DOUBLE}, - {CLASS_NAME_STRING, AniArgsType::ANI_STRING}, - {CLASS_NAME_BIGINT, AniArgsType::ANI_BIGINT}, -}; -} - -static AniArgsType GetArgType(ani_env *env, ani_object elementObj) -{ - if (HiSysEventAniUtil::IsRefUndefined(env, static_cast(elementObj))) { - return AniArgsType::ANI_UNDEFINED; - } - for (const auto& objType : OBJECT_TYPE) { - ani_class cls {}; - if (ANI_OK != env->FindClass(objType.first, &cls)) { - continue; - } - ani_boolean isInstance = ANI_FALSE; - if (ANI_OK != env->Object_InstanceOf(elementObj, cls, &isInstance)) { - HILOG_ERROR(LOG_CORE, "check instance failed for type '%{public}s'", objType.first); - continue; - } - if (static_cast(isInstance)) { - return objType.second; - } - } - return AniArgsType::ANI_UNKNOWN; } static bool IsValidParamType(AniArgsType type) @@ -101,7 +72,7 @@ static AniArgsType GetArrayType(ani_env *env, ani_array arrayRef) HILOG_ERROR(LOG_CORE, "fail to get first element in array."); return AniArgsType::ANI_UNKNOWN; } - return GetArgType(env, static_cast(valueRef)); + return HiSysEventAniUtil::GetArgType(env, static_cast(valueRef)); } static bool AddArrayParamToEventInfoExec(ani_env *env, const std::string& key, ani_ref arrayRef, @@ -166,7 +137,7 @@ static bool AddArrayParamToEventInfo(ani_env *env, const std::string& key, ani_r static bool AddParamToEventInfo(ani_env *env, const std::string& key, ani_ref value, HiSysEventInfo& info) { - AniArgsType type = GetArgType(env, static_cast(value)); + AniArgsType type = HiSysEventAniUtil::GetArgType(env, static_cast(value)); if (!IsValidParamType(type)) { return false; } @@ -750,7 +721,7 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) } ani_namespace ns {}; if (ANI_OK != env->FindNamespace(CLASS_NAME_HISYSEVENTANI, &ns)) { - return ANI_INVALID_ARGS; + return ANI_ERROR; } std::array methods = { ani_native_function {"writeSync", nullptr, reinterpret_cast(HiSysEventAni::WriteSync) }, @@ -762,8 +733,11 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) ani_native_function {"unsubscribe", nullptr, reinterpret_cast(HiSysEventAni::Unsubscribe) }, }; if (ANI_OK != env->Namespace_BindNativeFunctions(ns, methods.data(), methods.size())) { - return ANI_INVALID_TYPE; + return ANI_ERROR; }; + if (!HiSysEventAniUtil::InitAniClassAndMethod(env)) { + return ANI_ERROR; + } *result = ANI_VERSION_1; return ANI_OK; } diff --git a/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp b/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp index 91a78a4..0024799 100644 --- a/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp +++ b/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp @@ -47,6 +47,108 @@ static const std::map ANI_EVENTTYPE_INDEX_MAP = { {EventTypeAni::BEHAVIOR, 3}, }; +const std::pair OBJECT_TYPE[] = { + {CLASS_NAME_BOOLEAN, AniArgsType::ANI_BOOLEAN}, + {CLASS_NAME_INT, AniArgsType::ANI_INT}, + {CLASS_NAME_DOUBLE, AniArgsType::ANI_DOUBLE}, + {CLASS_NAME_STRING, AniArgsType::ANI_STRING}, + {CLASS_NAME_BIGINT, AniArgsType::ANI_BIGINT}, +}; + +static std::map ANI_CLASS_MAP = { + {CLASS_NAME_BOOLEAN, nullptr}, + {CLASS_NAME_INT, nullptr}, + {CLASS_NAME_DOUBLE, nullptr}, + {CLASS_NAME_STRING, nullptr}, + {CLASS_NAME_BIGINT, nullptr}, +}; + +static std::map ANI_CLASS_METHOD_MAP = { + {"IntUnboxed", nullptr}, + {"BooleanUnboxed", nullptr}, + {"BooleanCtor", nullptr}, + {"DoubleUnboxed", nullptr}, + {"DoubleCtor", nullptr}, + {"BigintGetlong", nullptr}, +}; + +static bool InitAniClassMap(ani_env *env) +{ + for (const auto &classPair : ANI_CLASS_MAP) { + ani_class cls {}; + if (ANI_OK != env->FindClass(classPair.first, &cls)) { + return false; + } + ANI_CLASS_MAP[classPair.first] = cls; + } + return true; +} + +static bool InitAniMethodMap(ani_env *env) +{ + ani_method intUnboxed = nullptr; + if (env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_INT]), + FUNC_NAME_UNBOXED, ":i", &intUnboxed) != ANI_OK) { + return false; + } + ANI_CLASS_METHOD_MAP["IntUnboxed"] = intUnboxed; + ani_method booleanUnboxed = nullptr; + if (env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_BOOLEAN]), + FUNC_NAME_UNBOXED, ":z", &booleanUnboxed) != ANI_OK) { + return false; + } + ANI_CLASS_METHOD_MAP["BooleanUnboxed"] = booleanUnboxed; + ani_method booleanCtor = nullptr; + if (env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_BOOLEAN]), + "", "d:", &booleanCtor) != ANI_OK) { + return false; + } + ANI_CLASS_METHOD_MAP["BooleanCtor"] = booleanCtor; + ani_method doubleUnboxed = nullptr; + if (env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), + FUNC_NAME_UNBOXED, ":d", &doubleUnboxed) != ANI_OK) { + return false; + } + ANI_CLASS_METHOD_MAP["DoubleUnboxed"] = doubleUnboxed; + ani_method doubleCtor = nullptr; + if (env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), + "", "d:", &doubleCtor) != ANI_OK) { + return false; + } + ANI_CLASS_METHOD_MAP["DoubleCtor"] = doubleUnboxed; + ani_method bigintGetLong {}; + if (ANI_OK != env->Class_FindMethod(static_cast(ANI_CLASS_MAP[CLASS_NAME_BIGINT]), + FUNC_NAME_GETLONG, ":l", &bigintGetLong)) { + return false; + } + ANI_CLASS_METHOD_MAP["BigintGetlong"] = bigintGetLong; + return true; +} + +bool HiSysEventAniUtil::InitAniClassAndMethod(ani_env *env) +{ + return InitAniClassMap(env) && InitAniMethodMap(env); +} + +AniArgsType HiSysEventAniUtil::GetArgType(ani_env *env, ani_object elementObj) +{ + if (HiSysEventAniUtil::IsRefUndefined(env, static_cast(elementObj))) { + return AniArgsType::ANI_UNDEFINED; + } + for (const auto& objType : OBJECT_TYPE) { + ani_boolean isInstance = ANI_FALSE; + if (ANI_OK != env->Object_InstanceOf(elementObj, static_cast(ANI_CLASS_MAP[objType.first]), + &isInstance)) { + HILOG_ERROR(LOG_CORE, "check instance failed for type '%{public}s'", objType.first); + continue; + } + if (static_cast(isInstance)) { + return objType.second; + } + } + return AniArgsType::ANI_UNKNOWN; +} + bool HiSysEventAniUtil::CheckKeyTypeString(const std::string& str) { bool ret = true; @@ -92,17 +194,8 @@ bool HiSysEventAniUtil::IsSystemAppCall() int64_t HiSysEventAniUtil::ParseBigintValue(ani_env *env, ani_ref elementRef) { ani_long longNum = 0; - ani_class cls {}; - if (ANI_OK != env->FindClass(CLASS_NAME_BIGINT, &cls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_BIGINT); - return static_cast(longNum); - } - ani_method getLongMethod {}; - if (ANI_OK != env->Class_FindMethod(cls, FUNC_NAME_GETLONG, ":l", &getLongMethod)) { - HILOG_ERROR(LOG_CORE, "find method %{public}s failed", FUNC_NAME_GETLONG); - return static_cast(longNum); - } - if (ANI_OK != env->Object_CallMethod_Long(static_cast(elementRef), getLongMethod, &longNum)) { + if (ANI_OK != env->Object_CallMethod_Long(static_cast(elementRef), + ANI_CLASS_METHOD_MAP["BigintGetlong"], &longNum)) { HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNC_NAME_GETLONG); return static_cast(longNum); } @@ -112,17 +205,8 @@ int64_t HiSysEventAniUtil::ParseBigintValue(ani_env *env, ani_ref elementRef) bool HiSysEventAniUtil::ParseBoolValue(ani_env *env, ani_ref elementRef) { ani_boolean booleanVal = ANI_FALSE; - ani_class cls {}; - if (ANI_OK != env->FindClass(CLASS_NAME_BOOLEAN, &cls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_BOOLEAN); - return false; - } - ani_method unboxedMethod {}; - if (ANI_OK != env->Class_FindMethod(cls, FUNC_NAME_UNBOXED, ":z", &unboxedMethod)) { - HILOG_ERROR(LOG_CORE, "find method %{public}s failed", FUNC_NAME_UNBOXED); - return false; - } - if (ANI_OK != env->Object_CallMethod_Boolean(static_cast(elementRef), unboxedMethod, &booleanVal)) { + if (ANI_OK != env->Object_CallMethod_Boolean(static_cast(elementRef), + ANI_CLASS_METHOD_MAP["BooleanUnboxed"], &booleanVal)) { HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNC_NAME_UNBOXED); return false; } @@ -132,17 +216,8 @@ bool HiSysEventAniUtil::ParseBoolValue(ani_env *env, ani_ref elementRef) int HiSysEventAniUtil::ParseIntValue(ani_env *env, ani_ref elementRef) { ani_int intVal = 0; - ani_class cls {}; - if (ANI_OK != env->FindClass(CLASS_NAME_INT, &cls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_INT); - return static_cast(intVal); - } - ani_method unboxedMethod {}; - if (ANI_OK != env->Class_FindMethod(cls, FUNC_NAME_UNBOXED, ":i", &unboxedMethod)) { - HILOG_ERROR(LOG_CORE, "find method %{public}s failed", FUNC_NAME_UNBOXED); - return static_cast(intVal); - } - if (ANI_OK != env->Object_CallMethod_Int(static_cast(elementRef), unboxedMethod, &intVal)) { + if (ANI_OK != env->Object_CallMethod_Int(static_cast(elementRef), + ANI_CLASS_METHOD_MAP["IntUnboxed"], &intVal)) { HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNC_NAME_UNBOXED); return static_cast(intVal); } @@ -152,17 +227,8 @@ int HiSysEventAniUtil::ParseIntValue(ani_env *env, ani_ref elementRef) double HiSysEventAniUtil::ParseNumberValue(ani_env *env, ani_ref elementRef) { ani_double doubleVal = 0; - ani_class cls {}; - if (ANI_OK != env->FindClass(CLASS_NAME_DOUBLE, &cls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return static_cast(doubleVal); - } - ani_method unboxedMethod {}; - if (ANI_OK != env->Class_FindMethod(cls, FUNC_NAME_UNBOXED, ":d", &unboxedMethod)) { - HILOG_ERROR(LOG_CORE, "find method %{public}s failed", FUNC_NAME_UNBOXED); - return static_cast(doubleVal); - } - if (ANI_OK != env->Object_CallMethod_Double(static_cast(elementRef), unboxedMethod, &doubleVal)) { + if (ANI_OK != env->Object_CallMethod_Double(static_cast(elementRef), + ANI_CLASS_METHOD_MAP["DoubleUnboxed"], &doubleVal)) { HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNC_NAME_UNBOXED); return static_cast(doubleVal); } @@ -336,17 +402,8 @@ ani_object HiSysEventAniUtil::WriteResult(ani_env *env, const std::pairFindClass(CLASS_NAME_DOUBLE, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(number))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), ANI_CLASS_METHOD_MAP["DoubleCtor"], + &personInfoObj, static_cast(number))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } @@ -356,17 +413,8 @@ ani_object HiSysEventAniUtil::CreateDoubleInt64(ani_env *env, int64_t number) ani_object HiSysEventAniUtil::CreateDouble(ani_env *env, double number) { ani_object personInfoObj = nullptr; - ani_class personCls; - if (ANI_OK != env->FindClass(CLASS_NAME_DOUBLE, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(number))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), ANI_CLASS_METHOD_MAP["DoubleCtor"], + &personInfoObj, static_cast(number))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } @@ -376,17 +424,8 @@ ani_object HiSysEventAniUtil::CreateDouble(ani_env *env, double number) ani_object HiSysEventAniUtil::CreateBool(ani_env *env, bool boolValue) { ani_object personInfoObj = nullptr; - ani_class personCls; - if (ANI_OK != env->FindClass(CLASS_NAME_BOOLEAN, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(boolValue))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_BOOLEAN]), ANI_CLASS_METHOD_MAP["BooleanCtor"], + &personInfoObj, static_cast(boolValue))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } @@ -396,17 +435,8 @@ ani_object HiSysEventAniUtil::CreateBool(ani_env *env, bool boolValue) ani_object HiSysEventAniUtil::CreateDoubleUint64(ani_env *env, uint64_t number) { ani_object personInfoObj = nullptr; - ani_class personCls; - if (ANI_OK != env->FindClass(CLASS_NAME_DOUBLE, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(number))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), ANI_CLASS_METHOD_MAP["DoubleCtor"], + &personInfoObj, static_cast(number))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } @@ -416,17 +446,8 @@ ani_object HiSysEventAniUtil::CreateDoubleUint64(ani_env *env, uint64_t number) ani_object HiSysEventAniUtil::CreateDoubleInt32(ani_env *env, int32_t number) { ani_object personInfoObj = nullptr; - ani_class personCls; - if (ANI_OK != env->FindClass(CLASS_NAME_DOUBLE, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(number))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), ANI_CLASS_METHOD_MAP["DoubleCtor"], + &personInfoObj, static_cast(number))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } @@ -457,17 +478,8 @@ ani_enum_item HiSysEventAniUtil::ToAniEnum(ani_env *env, EventTypeAni value) ani_object HiSysEventAniUtil::CreateDoubleUint32(ani_env *env, uint32_t number) { ani_object personInfoObj = nullptr; - ani_class personCls; - if (ANI_OK != env->FindClass(CLASS_NAME_DOUBLE, &personCls)) { - HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_DOUBLE); - return personInfoObj; - } - ani_method personInfoCtor; - if (ANI_OK != env->Class_FindMethod(personCls, "", "d:", &personInfoCtor)) { - HILOG_ERROR(LOG_CORE, "find method failed"); - return personInfoObj; - } - if (ANI_OK != env->Object_New(personCls, personInfoCtor, &personInfoObj, static_cast(number))) { + if (ANI_OK != env->Object_New(static_cast(ANI_CLASS_MAP[CLASS_NAME_DOUBLE]), ANI_CLASS_METHOD_MAP["DoubleCtor"], + &personInfoObj, static_cast(number))) { HILOG_ERROR(LOG_CORE, "create object %{public}s failed", CLASS_NAME_DOUBLE); return personInfoObj; } -- Gitee