From 229953296f9c7e48b7aed668c3129085595e7506 Mon Sep 17 00:00:00 2001 From: LeechyLiang Date: Sun, 6 Apr 2025 21:51:21 +0800 Subject: [PATCH] Modify signature rawString2Builder Signed-off-by: LeechyLiang Change-Id: Icb291d95177f7972716e1287f558c6ee930dadb9 --- sdk/BUILD.gn | 1 + sdk/native/api/ani_textdecoder.cpp | 8 +++++++- sdk/native/api/ani_textencoder.cpp | 15 ++++++++++++--- sdk/native/main.cpp | 26 +++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index e3e201d6..16e8bfbd 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -83,6 +83,7 @@ ohos_shared_library("commonlib_ets_ani") { "icu:shared_icuuc", "openssl:libcrypto_shared", "runtime_core:ani", + "runtime_core:ani_helpers", ] if (is_standard_system) { external_deps += [ "hilog:libhilog" ] diff --git a/sdk/native/api/ani_textdecoder.cpp b/sdk/native/api/ani_textdecoder.cpp index f7154ac9..861f06e7 100644 --- a/sdk/native/api/ani_textdecoder.cpp +++ b/sdk/native/api/ani_textdecoder.cpp @@ -15,6 +15,7 @@ #include #include "ani_textdecoder.h" +#include #include "securec.h" #include "ohos/init_data.h" @@ -144,13 +145,18 @@ ani_object TextDecoder::ThrowError(ani_env *env, std::string message) env->String_NewUTF8(message.c_str(), message.size(), &errString); static const char *className = "L@ohos/util/util/BusinessError;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOG_ERROR("TextDecoder:: Not found %{public}s", className); return nullptr; } ani_method errorCtor; - if (ANI_OK != env->Class_FindMethod(cls, "", "Lstd/core/String;:V", &errorCtor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddClass({"std", "core", "String"}); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &errorCtor)) { HILOG_ERROR("TextDecoder:: Class_FindMethod Failed"); return nullptr; } diff --git a/sdk/native/api/ani_textencoder.cpp b/sdk/native/api/ani_textencoder.cpp index 8381a094..aa0b403a 100644 --- a/sdk/native/api/ani_textencoder.cpp +++ b/sdk/native/api/ani_textencoder.cpp @@ -18,6 +18,7 @@ #include #include #include "ani_textencoder.h" +#include #define ANI_RETURN_NULLOPT_ON_FAILURE(retCode, ...) \ if (ANI_OK != (retCode)) { \ @@ -57,10 +58,12 @@ ani_object NewUint8Array(ani_env *env, const char* signature, Args... args) { // todo with further optimization: Can FindClass and FindMethod be one-pass? ani_class arrayClass; - ANI_RETURN_NULLPTR_ON_FAILURE(env->FindClass("Lescompat/Uint8Array;", &arrayClass), + auto classTypeUint8Array = arkts::ani_signature::Builder::BuildClass({"escompat", "Uint8Array"}); + ANI_RETURN_NULLPTR_ON_FAILURE(env->FindClass(classTypeUint8Array.Descriptor().c_str(), &arrayClass), "Internal failure: env->FindClass()"); ani_method arrayCtor; - ANI_RETURN_NULLPTR_ON_FAILURE(env->Class_FindMethod(arrayClass, "", signature, &arrayCtor), + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + ANI_RETURN_NULLPTR_ON_FAILURE(env->Class_FindMethod(arrayClass, methodCtor.c_str(), signature, &arrayCtor), "Internal failure: env->Class_FindMethod() with signature %{public}s", signature); ani_object res; ANI_RETURN_NULLPTR_ON_FAILURE(env->Object_New(arrayClass, arrayCtor, &res, args...), @@ -311,12 +314,18 @@ ani_object DoEncodeIntoUint8Array( ani_class resultClass; const char *resultClassName = "L@ohos/util/util/EncodeIntoUint8ArrayInfoInner;"; + // Pls replace manually if (ANI_OK != env->FindClass(resultClassName, &resultClass)) { HILOG_ERROR("TextEncoder:: Failed to get class %{public}s", resultClassName); return nullptr; // todo: Exception handling } ani_method resultCtor; - if (ANI_OK != env->Class_FindMethod(resultClass, "", "II:V", &resultCtor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddInt(); + methodCtorSigBuilder.AddInt(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(resultClass, methodCtor.c_str(), methodCtorSignature.c_str(), &resultCtor)) { HILOG_ERROR("TextEncoder:: Failed to get constructor of class %{public}s", resultClassName); return nullptr; // todo: Exception handling } diff --git a/sdk/native/main.cpp b/sdk/native/main.cpp index ba1b179a..c96d6427 100644 --- a/sdk/native/main.cpp +++ b/sdk/native/main.cpp @@ -14,6 +14,7 @@ */ #include +#include #include #include #include "api/ani_textdecoder.h" @@ -115,14 +116,24 @@ static ani_status BindTextDecoder(ani_env *env) { static const char *className = "L@ohos/util/util/TextDecoder;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOG_ERROR("TextDecoder:: Not found %{public}s", className); return ANI_ERROR; } + arkts::ani_signature::SignatureBuilder BindNativeDecoderSigBuilder; + BindNativeDecoderSigBuilder.AddClass({"std", "core", "String"}); + BindNativeDecoderSigBuilder.AddInt(); + auto BindNativeDecoderSignature = BindNativeDecoderSigBuilder.BuildSignatureDescriptor(); + arkts::ani_signature::SignatureBuilder DecodeSigBuilder; + DecodeSigBuilder.AddClass({"escompat", "Uint8Array"}); + DecodeSigBuilder.AddBoolean(); + DecodeSigBuilder.SetReturnClass("std.core.String"); + auto DecodeSignature = DecodeSigBuilder.BuildSignatureDescriptor(); std::array methods = { - ani_native_function {"bindNativeDecoder", "Lstd/core/String;I:V", reinterpret_cast(BindNativeDecoder)}, - ani_native_function {"decode", "Lescompat/Uint8Array;Z:Lstd/core/String;", reinterpret_cast(Decode)}, + ani_native_function{ "bindNativeDecoder", BindNativeDecoderSignature.c_str(), reinterpret_cast(BindNativeDecoder) }, + ani_native_function{ "decode", DecodeSignature.c_str(), reinterpret_cast(Decode) }, }; if (ANI_OK != env->Class_BindNativeMethods(cls, methods.data(), methods.size())) { @@ -145,13 +156,18 @@ static ani_status BindUtilHelper(ani_env *env) { static const char *className = "L@ohos/util/util/UtilHelper;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { std::cerr << "Not found '" << className << "'" << std::endl; return ANI_ERROR; } + arkts::ani_signature::SignatureBuilder GenerateRandomUUIDSigBuilder; + GenerateRandomUUIDSigBuilder.AddBoolean(); + GenerateRandomUUIDSigBuilder.SetReturnClass("std.core.String"); + auto GenerateRandomUUIDSignature = GenerateRandomUUIDSigBuilder.BuildSignatureDescriptor(); std::array methods = { - ani_native_function {"generateRandomUUID", "Z:Lstd/core/String;", reinterpret_cast(GenerateRandomUUID)}, + ani_native_function{ "generateRandomUUID", GenerateRandomUUIDSignature.c_str(), reinterpret_cast(GenerateRandomUUID) }, }; if (ANI_OK != env->Class_BindNativeMethods(cls, methods.data(), methods.size())) { @@ -165,10 +181,14 @@ static ani_status BindUtilHelper(ani_env *env) { ani_class cls; const char *className = "L@ohos/util/util/TextEncoder;"; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOG_ERROR("TextEncoder:: Not found %{public}s", className); return ANI_ERROR; } + arkts::ani_signature::SignatureBuilder createSigBuilder; + createSigBuilder.SetReturnClass("@ohos.UiTest.Driver"); + auto createSignature = createSigBuilder.BuildSignatureDescriptor(); std::array barMethods = { ani_native_function { "doEncodeInto", -- Gitee