From d77fca079c904317fa79f06ed1e9c564ee99eb96 Mon Sep 17 00:00:00 2001 From: zhuxiantao99 Date: Thu, 20 Mar 2025 14:58:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhuxiantao99 --- .../ets/runtime/ani/docs/ani_scenario.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/static_core/plugins/ets/runtime/ani/docs/ani_scenario.md b/static_core/plugins/ets/runtime/ani/docs/ani_scenario.md index 01bacb052..8f36f465e 100644 --- a/static_core/plugins/ets/runtime/ani/docs/ani_scenario.md +++ b/static_core/plugins/ets/runtime/ani/docs/ani_scenario.md @@ -1308,6 +1308,104 @@ ADD_LOG(/* 此处添加日志打印 `output` */); 常见原因为入参类型与实际所需类型不一致。强烈建议不要使用 nullptr 获取构造函数。因为构造函数的场景是特殊的,例如构造函数的入参为可选参数时是通过重载实现的,这会导致 nullptr 获取到随机的构造函数。 +#### DFX ani abc运行失败 +``` +class HilogAni { +public: + static ani_boolean IsLoggable(ani_env *env, ani_object object, ani_double domain, ani_string tag, ani_enum_item level); +}; + +static ani_status EnumGetValueInt32(ani_env *env, ani_enum_item enumItem, int32_t &value) { + ani_int aniInt {}; + env->EnumItem_GetValue_Int(enumItem, &aniInt); + static_cast(aniInt); + return ANI_OK; +} + +## HilogAni 类方法实现 + +ani_boolean HilogAni::IsLoggable(ani_env *env, ani_object object, ani_double domain, ani_string tag, ani_enum_item level) { + int32_t domainVal = static_cast(domain); + int32_t levelVal; + std::string tagStr = AniStringToStdString(env, tag); + + // 从枚举项中获取日志级别值 + EnumGetValueInt32(env, level, levelVal); + + // 调用 HiLogIsLoggable 函数检查日志是否可记录 + HiLogIsLoggable(domainVal, tagStr.c_str(), static_cast(levelVal)); + return static_cast(res); +} +``` +#### 异常处理工具类 +```cpp + static ani_status Throw(ani_env *env, int32_t code, const std::string &errMsg) { + const char *className = "YourErrorClassName"; // 替换为实际的错误类名 + const char *name = "YourErrorName"; // 替换为实际的错误名 + ani_class cls; + env->FindClass(className, &cls); + ani_method ctor; + env->Class_FindMethod(cls, "", ":V", &ctor); + ani_object obj; + env->Object_New(cls, ctor, &obj); + + //设置异常obj对象的字段值 + //SetFieldValue(obj, ...) + env->ThrowError(static_cast(obj)) + return ANI_OK; + } +}; +``` + +#### 枚举使用方法 +``` +(sts->Native) +将 ani_enum_item 转换为本地类型 T。函数内部使用了 if constexpr 进行类型判断,并根据类型执行相应的转换逻辑 +template +static bool EnumConvert_StsToNative(ani_env *env, ani_enum_item enumItem, T &result) { + if constexpr (std::is_enum_v || std::is_integral_v) { + ani_int intValue{}; + env->EnumItem_GetValue_Int(enumItem, &intValue); + result = static_cast(intValue); + return true; + } else if constexpr (std::is_same_v) { + ani_string strValue{}; + env->EnumItem_GetValue_String(enumItem, &strValue); + return GetStdString(env, strValue, result); + } else if constexpr (std::is_same_v) { + ani_string strValue{}; + env->EnumItem_GetValue_String(enumItem, &strValue); + result = strValue; + return true; + } else { + return false; + } +} +``` +``` +(native->sts) +将本地类型 T 转换为 ani_enum_item。函数首先通过枚举名查找枚举类型,然后遍历枚举项,通过比较值找到匹配的枚举项。 +template +static bool EnumConvert_NativeToSts(ani_env *env, const char *enumName, const T enumValue, ani_enum_item &result) { + ani_enum aniEnum{}; + // 通过枚举名查找枚举类型 + env->FindEnum(enumName, &aniEnum); + constexpr int32_t loopMaxNum = 1000; + // 遍历枚举项 + for (int32_t index = 0; index < loopMaxNum; index++) { + ani_enum_item enumItem{}; + // 通过索引获取枚举项 + env->Enum_GetEnumItemByIndex(aniEnum, index, &enumItem); + T tmpValue{}; + // 将枚举项转换为本地类型 T 并进行比较 + if (EnumConvert_StsToNative(env, enumItem, tmpValue) && tmpValue == enumValue) { + result = enumItem; + return true; + } + } + return false; +} +``` ## 22 ANI 性能分析 待补充 -- Gitee