Android: Avoid caching the same class twice.

The class name scheme can be separated by '/' or '.', if both formats
where used we would end-up caching those classes twice.

Change-Id: I3ae69694d6a8616bbaadfb3c2d0717fbf9ccb9fc
Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
bb10
Christian Strømme 2014-08-06 17:24:52 +02:00 committed by Christian Stromme
parent 1498c99e9d
commit 2529a8aaa2
1 changed files with 4 additions and 5 deletions

View File

@ -86,15 +86,14 @@ Q_GLOBAL_STATIC(JClassHash, cachedClasses)
static jclass getCachedClass(JNIEnv *env, const char *className)
{
jclass clazz = 0;
QString key = QLatin1String(className);
QHash<QString, jclass>::iterator it = cachedClasses->find(key);
QString classDotEnc = QString::fromLatin1(className).replace(QLatin1Char('/'), QLatin1Char('.'));
QHash<QString, jclass>::iterator it = cachedClasses->find(classDotEnc);
if (it == cachedClasses->end()) {
QJNIObjectPrivate classLoader = QtAndroidPrivate::classLoader();
if (!classLoader.isValid())
return 0;
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QString::fromLatin1(className).replace(QLatin1Char('/'),
QLatin1Char('.')));
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(classDotEnc);
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;",
stringName.object());
@ -102,7 +101,7 @@ static jclass getCachedClass(JNIEnv *env, const char *className)
if (!exceptionCheckAndClear(env) && classObject.isValid())
clazz = static_cast<jclass>(env->NewGlobalRef(classObject.object()));
cachedClasses->insert(key, clazz);
cachedClasses->insert(classDotEnc, clazz);
} else {
clazz = it.value();
}