summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@theqtcompany.com>2014-10-30 19:44:11 +0100
committerChristian Stromme <christian.stromme@digia.com>2014-11-03 18:24:56 +0100
commit7a3a3a5694f9d20a759debf7a1fb8cb68b7d053b (patch)
tree01f7206bf2731104fd690ed5f2fee61bf5b080a0 /src/corelib/kernel
parentc998200282d5a6ce416aa8af9a6677fc2b1503af (diff)
Android: Add runOnUiThread() function
Enables QRunnables to be run on the UI thread. For now this function is only intended for internal consumption. Change-Id: I5e2abb06104219a9dd55b3308113056e4da5fa07 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp38
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h3
2 files changed, 41 insertions, 0 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index c82b5ca033..d3bbce305a 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -34,6 +34,7 @@
#include "qjnihelpers_p.h"
#include "qmutex.h"
#include "qlist.h"
+#include <QtCore/qrunnable.h>
QT_BEGIN_NAMESPACE
@@ -41,6 +42,19 @@ static JavaVM *g_javaVM = Q_NULLPTR;
static jobject g_jActivity = Q_NULLPTR;
static jobject g_jClassLoader = Q_NULLPTR;
static jint g_androidSdkVersion = 0;
+static jclass g_jNativeClass = Q_NULLPTR;
+static jmethodID g_runQtOnUiThreadMethodID = Q_NULLPTR;
+
+static void onAndroidUiThread(JNIEnv *, jclass, jlong thiz)
+{
+ QRunnable *runnable = reinterpret_cast<QRunnable *>(thiz);
+ if (runnable == 0)
+ return;
+
+ runnable->run();
+ if (runnable->autoDelete())
+ delete runnable;
+}
namespace {
class ActivityResultListeners
@@ -140,6 +154,22 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
env->DeleteLocalRef(activity);
g_javaVM = vm;
+ static const JNINativeMethod methods[] = {
+ {"onAndroidUiThread", "(J)V", reinterpret_cast<void *>(onAndroidUiThread)}
+ };
+
+ const bool regOk = (env->RegisterNatives(jQtNative, methods, sizeof(methods) / sizeof(methods[0])) == JNI_OK);
+
+ if (!regOk && exceptionCheck(env))
+ return JNI_ERR;
+
+ g_runQtOnUiThreadMethodID = env->GetStaticMethodID(jQtNative,
+ "runQtOnUiThread",
+ "(J)V");
+
+ g_jNativeClass = static_cast<jclass>(env->NewGlobalRef(jQtNative));
+ env->DeleteLocalRef(jQtNative);
+
return JNI_OK;
}
@@ -164,4 +194,12 @@ jint QtAndroidPrivate::androidSdkVersion()
return g_androidSdkVersion;
}
+void QtAndroidPrivate::runOnUiThread(QRunnable *runnable, JNIEnv *env)
+{
+ Q_ASSERT(runnable != 0);
+ env->CallStaticVoidMethod(g_jNativeClass, g_runQtOnUiThreadMethodID, reinterpret_cast<jlong>(runnable));
+ if (exceptionCheck(env) && runnable != 0 && runnable->autoDelete())
+ delete runnable;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h
index 80c50ba611..6456dce4c4 100644
--- a/src/corelib/kernel/qjnihelpers_p.h
+++ b/src/corelib/kernel/qjnihelpers_p.h
@@ -50,6 +50,8 @@
QT_BEGIN_NAMESPACE
+class QRunnable;
+
namespace QtAndroidPrivate
{
class Q_CORE_EXPORT ActivityResultListener
@@ -64,6 +66,7 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
jobject classLoader();
Q_CORE_EXPORT jint androidSdkVersion();
+ Q_CORE_EXPORT void runOnUiThread(QRunnable *runnable, JNIEnv *env);
Q_CORE_EXPORT void handleActivityResult(jint requestCode, jint resultCode, jobject data);
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener);