From 2529a8aaa2f5781f0d665f377a848626439c2de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Wed, 6 Aug 2014 17:24:52 +0200 Subject: [PATCH] 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 --- src/corelib/kernel/qjni.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp index 4581b70ca7..b240185d7e 100644 --- a/src/corelib/kernel/qjni.cpp +++ b/src/corelib/kernel/qjni.cpp @@ -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::iterator it = cachedClasses->find(key); + QString classDotEnc = QString::fromLatin1(className).replace(QLatin1Char('/'), QLatin1Char('.')); + QHash::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(env->NewGlobalRef(classObject.object())); - cachedClasses->insert(key, clazz); + cachedClasses->insert(classDotEnc, clazz); } else { clazz = it.value(); }