QJniArray: find the java/lang/String class from the cache

Don't look it up through JNIEnv::FindString, use our internal cache. For
that (and as we don't want to instantiate a temporary QJniEnvironment)
we need to use the QtAndroidPrivate internal symbol, which then needs to
be forward declared.

Change-Id: I4a69bf973fbdc1df6939f5ce94878588a4fcbd3d
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Soheil Armin <soheil.armin@qt.io>
This commit is contained in:
Volker Hilsheimer 2024-11-13 14:27:00 +01:00
parent 4de9b94042
commit 1a2ffdc9b6

View File

@ -24,6 +24,12 @@ QT_BEGIN_NAMESPACE
template <typename T> class QJniArray;
template <typename T> struct QJniArrayMutableIterator;
// forward declare here so that we don't have to include the private header
namespace QtAndroidPrivate
{
Q_CORE_EXPORT jclass findClass(const char *className, JNIEnv *env);
}
template <typename T>
struct QJniArrayIterator
{
@ -915,7 +921,7 @@ auto QJniArrayBase::makeObjectArray(List &&list)
std::is_base_of<QtJniTypes::JObjectBase, ElementType>>) {
elementClass = std::begin(list)->objectClass();
} else if constexpr (std::is_same_v<ElementType, QString>) {
elementClass = env->FindClass("java/lang/String");
elementClass = QtAndroidPrivate::findClass("java/lang/String", env);
} else {
elementClass = env->GetObjectClass(*std::begin(list));
}