summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qjni.cpp
diff options
context:
space:
mode:
authorSergio Ahumada <sergio.ahumada@digia.com>2013-09-27 11:31:32 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-27 11:31:32 +0200
commit150b8ca29417de2cd423ff92478eaf4cb2906601 (patch)
treeaa1c43ee9d096a4464636bcb5f294a11846572f4 /src/corelib/kernel/qjni.cpp
parentbd78389fc4fe0a4367696ba2fdcc6e8d09863698 (diff)
parent16a36239ab9e9be45a940aeff94f35e29bdeb944 (diff)
Merge "Merge branch 'stable' into dev" into refs/staging/dev
Diffstat (limited to 'src/corelib/kernel/qjni.cpp')
-rw-r--r--src/corelib/kernel/qjni.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 17678fcbba..d1113e4eae 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -70,16 +70,24 @@ static jclass getCachedClass(JNIEnv *env, const char *className)
QString key = QLatin1String(className);
QHash<QString, jclass>::iterator it = cachedClasses->find(key);
if (it == cachedClasses->end()) {
- jclass c = env->FindClass(className);
+ QJNIObjectPrivate classLoader = QtAndroidPrivate::classLoader();
+ if (!classLoader.isValid())
+ return 0;
+
+ QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QLatin1String(className));
+ QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
+ "(Ljava/lang/String;)Ljava/lang/Class;",
+ stringName.object());
if (env->ExceptionCheck()) {
- c = 0;
#ifdef QT_DEBUG
env->ExceptionDescribe();
#endif // QT_DEBUG
env->ExceptionClear();
}
- if (c)
- clazz = static_cast<jclass>(env->NewGlobalRef(c));
+
+ if (classObject.isValid())
+ clazz = static_cast<jclass>(env->NewGlobalRef(classObject.object()));
+
cachedClasses->insert(key, clazz);
} else {
clazz = it.value();
@@ -160,10 +168,12 @@ QJNIEnvironmentPrivate::QJNIEnvironmentPrivate()
: jniEnv(0)
{
JavaVM *vm = QtAndroidPrivate::javaVM();
- if (vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) != JNI_EDETACHED)
- return;
+ if (vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) == JNI_EDETACHED) {
+ if (vm->AttachCurrentThread(&jniEnv, 0) < 0)
+ return;
+ }
- if (vm->AttachCurrentThread(&jniEnv, 0) < 0)
+ if (!jniEnv)
return;
if (!refCount->hasLocalData())