From 7a3a3a5694f9d20a759debf7a1fb8cb68b7d053b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Thu, 30 Oct 2014 19:44:11 +0100 Subject: 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 --- src/corelib/kernel/qjnihelpers.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/corelib/kernel/qjnihelpers_p.h | 3 +++ 2 files changed, 41 insertions(+) (limited to 'src/corelib') 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 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(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(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(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(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); -- cgit v1.2.3