From aaeb4970fd3822daf698729f95d2cd88d234e754 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 10 Jun 2024 13:53:51 +0200 Subject: [PATCH] JNI: port QTimeZone on Android to QJniArray Replace code that manually operates on jarray with QJniArray. The comment about using separate jobject and QJniObject didn't make sense; we didn't construct the QJniObject via fromLocalRef(), so allocated a new local reference anyway, in addition to the local reference returned by GetObjectArrayElement. The implicit code now creates a QJniObject (-like object; QtJniTypes::String contains a QJniObject) as well, but it's also just a temporary. It would be cheaper to iterate over a QJniArray, but only if we then duplicate the code from QJniObject::toString to not create an intermediate QJniObject. Change-Id: I9f10541f533dd2fbd2f7ba6fdacc7d79b3ac3ae9 Reviewed-by: Assam Boudjelthia (cherry picked from commit 64127a7a0db657cbc844938f02b623f90cdd78ee) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/time/qtimezoneprivate_android.cpp | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp index 47fc68b1ac9..e80d15fab1b 100644 --- a/src/corelib/time/qtimezoneprivate_android.cpp +++ b/src/corelib/time/qtimezoneprivate_android.cpp @@ -14,7 +14,7 @@ QT_BEGIN_NAMESPACE Q_DECLARE_JNI_CLASS(TimeZone, "java/util/TimeZone"); Q_DECLARE_JNI_CLASS(Locale, "java/util/Locale"); Q_DECLARE_JNI_CLASS(Date, "java/util/Date"); -Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;") +Q_DECLARE_JNI_CLASS(String, "java/lang/String") /* Private @@ -209,23 +209,14 @@ bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) co QList QAndroidTimeZonePrivate::availableTimeZoneIds() const { + using namespace QtJniTypes; + + const QJniArray androidAvailableIdList = TimeZone::callStaticMethod("getAvailableIDs"); + QList availableTimeZoneIdList; - QJniObject androidAvailableIdList = QJniObject::callStaticMethod( - QtJniTypes::Traits::className(), "getAvailableIDs"); - - QJniEnvironment jniEnv; - int androidTZcount = jniEnv->GetArrayLength(androidAvailableIdList.object()); - - // need separate jobject and QJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject - // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement) - jobject androidTZobject; - QJniObject androidTZ; - for (int i = 0; i < androidTZcount; i++) { - androidTZobject = jniEnv->GetObjectArrayElement(androidAvailableIdList.object(), i); - androidTZ = androidTZobject; - availableTimeZoneIdList.append(androidTZ.toString().toUtf8()); - jniEnv->DeleteLocalRef(androidTZobject); - } + availableTimeZoneIdList.reserve(androidAvailableIdList.size()); + for (const auto &id : androidAvailableIdList) + availableTimeZoneIdList.append(id.toString().toUtf8()); return availableTimeZoneIdList; }