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 <qt_ci_bot@qt-project.org>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
Volker Hilsheimer 2023-10-11 13:54:16 +02:00
parent ba1eec62a8
commit 08bb24dd0a

View File

@ -86,7 +86,7 @@ public:
qsizetype size() const
{
if (jarray array = object<jarray>())
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<jobject, T>) {
return T{env->GetObjectArrayElement(object<jobjectArray>(), i)};
} else {
@ -219,7 +219,7 @@ public:
}
auto asContainer() const
{
QJniEnvironment env;
JNIEnv *env = jniEnv();
if constexpr (std::is_same_v<T, jobject>) {
QList<jobject> res;
res.reserve(size());