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
parent
1498c99e9d
commit
2529a8aaa2
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue