From 08bb24dd0a5c97bfefa8bb29d6c43af4525abd64 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 11 Oct 2023 13:54:16 +0200 Subject: [PATCH] JNI: make QJniArray class use stored JNI environment Instead of creating a temporary QJniEnvironment for each access to the array, reuse the one stored in the QJniObject. This is much more efficient, and also protects against invalid access to the array from multiple threads. Change-Id: Id253a51ca64d4b3af333b14ec62ae176e1663604 Reviewed-by: Qt CI Bot Reviewed-by: Assam Boudjelthia --- src/corelib/kernel/qjniarray.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index ba79e27b8ef..96eaafca836 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -86,7 +86,7 @@ public: qsizetype size() const { if (jarray array = object()) - return QJniEnvironment()->GetArrayLength(array); + return jniEnv()->GetArrayLength(array); return 0; } @@ -193,7 +193,7 @@ public: const T operator[](qsizetype i) const { return at(i); } // const return value to disallow assignment T at(qsizetype i) const { - QJniEnvironment env; + JNIEnv *env = jniEnv(); if constexpr (std::is_convertible_v) { return T{env->GetObjectArrayElement(object(), i)}; } else { @@ -219,7 +219,7 @@ public: } auto asContainer() const { - QJniEnvironment env; + JNIEnv *env = jniEnv(); if constexpr (std::is_same_v) { QList res; res.reserve(size());