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:
parent
ba1eec62a8
commit
08bb24dd0a
@ -86,7 +86,7 @@ public:
|
|||||||
qsizetype size() const
|
qsizetype size() const
|
||||||
{
|
{
|
||||||
if (jarray array = object<jarray>())
|
if (jarray array = object<jarray>())
|
||||||
return QJniEnvironment()->GetArrayLength(array);
|
return jniEnv()->GetArrayLength(array);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ public:
|
|||||||
const T operator[](qsizetype i) const { return at(i); } // const return value to disallow assignment
|
const T operator[](qsizetype i) const { return at(i); } // const return value to disallow assignment
|
||||||
T at(qsizetype i) const
|
T at(qsizetype i) const
|
||||||
{
|
{
|
||||||
QJniEnvironment env;
|
JNIEnv *env = jniEnv();
|
||||||
if constexpr (std::is_convertible_v<jobject, T>) {
|
if constexpr (std::is_convertible_v<jobject, T>) {
|
||||||
return T{env->GetObjectArrayElement(object<jobjectArray>(), i)};
|
return T{env->GetObjectArrayElement(object<jobjectArray>(), i)};
|
||||||
} else {
|
} else {
|
||||||
@ -219,7 +219,7 @@ public:
|
|||||||
}
|
}
|
||||||
auto asContainer() const
|
auto asContainer() const
|
||||||
{
|
{
|
||||||
QJniEnvironment env;
|
JNIEnv *env = jniEnv();
|
||||||
if constexpr (std::is_same_v<T, jobject>) {
|
if constexpr (std::is_same_v<T, jobject>) {
|
||||||
QList<jobject> res;
|
QList<jobject> res;
|
||||||
res.reserve(size());
|
res.reserve(size());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user