diff options
Diffstat (limited to 'src/corelib/kernel/qjnihelpers.cpp')
-rw-r--r-- | src/corelib/kernel/qjnihelpers.cpp | 111 |
1 files changed, 33 insertions, 78 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index 94b280baac..d900b74d37 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -10,6 +10,7 @@ #include "qsemaphore.h" #include "qreadwritelock.h" #include <QtCore/private/qcoreapplication_p.h> +#include <QtCore/private/qlocking_p.h> #include <android/log.h> #include <deque> @@ -25,8 +26,6 @@ namespace QtAndroidPrivate { ResumePauseListener::~ResumePauseListener() {} void ResumePauseListener::handlePause() {} void ResumePauseListener::handleResume() {} - GenericMotionEventListener::~GenericMotionEventListener() {} - KeyEventListener::~KeyEventListener() {} } static JavaVM *g_javaVM = nullptr; @@ -34,47 +33,13 @@ static jobject g_jActivity = nullptr; static jobject g_jService = nullptr; static jobject g_jClassLoader = nullptr; -Q_GLOBAL_STATIC(QtAndroidPrivate::OnBindListener *, g_onBindListener, nullptr); -Q_GLOBAL_STATIC(QMutex, g_onBindListenerMutex); +Q_CONSTINIT static QtAndroidPrivate::OnBindListener *g_onBindListener; +Q_CONSTINIT static QBasicMutex g_onBindListenerMutex; Q_GLOBAL_STATIC(QSemaphore, g_waitForServiceSetupSemaphore); -Q_GLOBAL_STATIC(QAtomicInt, g_serviceSetupLockers); +Q_CONSTINIT static QBasicAtomicInt g_serviceSetupLockers = Q_BASIC_ATOMIC_INITIALIZER(0); Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex); -namespace { - struct GenericMotionEventListeners { - QMutex mutex; - QList<QtAndroidPrivate::GenericMotionEventListener *> listeners; - }; -} -Q_GLOBAL_STATIC(GenericMotionEventListeners, g_genericMotionEventListeners) - -static jboolean dispatchGenericMotionEvent(JNIEnv *, jclass, jobject event) -{ - jboolean ret = JNI_FALSE; - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - for (auto *listener : qAsConst(g_genericMotionEventListeners()->listeners)) - ret |= listener->handleGenericMotionEvent(event); - return ret; -} - -namespace { - struct KeyEventListeners { - QMutex mutex; - QList<QtAndroidPrivate::KeyEventListener *> listeners; - }; -} -Q_GLOBAL_STATIC(KeyEventListeners, g_keyEventListeners) - -static jboolean dispatchKeyEvent(JNIEnv *, jclass, jobject event) -{ - jboolean ret = JNI_FALSE; - QMutexLocker locker(&g_keyEventListeners()->mutex); - for (auto *listener : qAsConst(g_keyEventListeners()->listeners)) - ret |= listener->handleKeyEvent(event); - return ret; -} - static jboolean updateNativeActivity(JNIEnv *env, jclass = nullptr) { @@ -271,8 +236,6 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env) } static const JNINativeMethod methods[] = { - {"dispatchGenericMotionEvent", "(Landroid/view/MotionEvent;)Z", reinterpret_cast<void *>(dispatchGenericMotionEvent)}, - {"dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z", reinterpret_cast<void *>(dispatchKeyEvent)}, {"updateNativeActivity", "()Z", reinterpret_cast<void *>(updateNativeActivity) }, }; @@ -281,21 +244,37 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env) if (!regOk && QJniEnvironment::checkAndClearExceptions(env)) return JNI_ERR; - if (!registerPermissionNatives()) + QJniEnvironment qJniEnv; + if (!registerPermissionNatives(qJniEnv)) + return JNI_ERR; + + if (!registerNativeInterfaceNatives(qJniEnv)) return JNI_ERR; - if (!registerNativeInterfaceNatives()) + if (!registerExtrasNatives(qJniEnv)) return JNI_ERR; return JNI_OK; } +Q_CORE_EXPORT jobject qt_androidActivity() +{ + QReadLocker locker(g_updateMutex()); + return g_jActivity; +} + + QtJniTypes::Activity QtAndroidPrivate::activity() { QReadLocker locker(g_updateMutex()); return g_jActivity; } +Q_CORE_EXPORT jobject qt_androidService() +{ + return g_jService; +} + QtJniTypes::Service QtAndroidPrivate::service() { return g_jService; @@ -330,30 +309,6 @@ jint QtAndroidPrivate::androidSdkVersion() return sdkVersion; } -void QtAndroidPrivate::registerGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener) -{ - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - g_genericMotionEventListeners()->listeners.push_back(listener); -} - -void QtAndroidPrivate::unregisterGenericMotionEventListener(QtAndroidPrivate::GenericMotionEventListener *listener) -{ - QMutexLocker locker(&g_genericMotionEventListeners()->mutex); - g_genericMotionEventListeners()->listeners.removeOne(listener); -} - -void QtAndroidPrivate::registerKeyEventListener(QtAndroidPrivate::KeyEventListener *listener) -{ - QMutexLocker locker(&g_keyEventListeners()->mutex); - g_keyEventListeners()->listeners.push_back(listener); -} - -void QtAndroidPrivate::unregisterKeyEventListener(QtAndroidPrivate::KeyEventListener *listener) -{ - QMutexLocker locker(&g_keyEventListeners()->mutex); - g_keyEventListeners()->listeners.removeOne(listener); -} - void QtAndroidPrivate::waitForServiceSetup() { g_waitForServiceSetupSemaphore->acquire(); @@ -361,41 +316,41 @@ void QtAndroidPrivate::waitForServiceSetup() int QtAndroidPrivate::acuqireServiceSetup(int flags) { - g_serviceSetupLockers->ref(); + g_serviceSetupLockers.ref(); return flags; } void QtAndroidPrivate::setOnBindListener(QtAndroidPrivate::OnBindListener *listener) { - QMutexLocker lock(g_onBindListenerMutex()); - *g_onBindListener = listener; - if (!g_serviceSetupLockers->deref()) + const auto lock = qt_scoped_lock(g_onBindListenerMutex); + g_onBindListener = listener; + if (!g_serviceSetupLockers.deref()) g_waitForServiceSetupSemaphore->release(); } jobject QtAndroidPrivate::callOnBindListener(jobject intent) { - QMutexLocker lock(g_onBindListenerMutex()); - if (*g_onBindListener) - return (*g_onBindListener)->onBind(intent); + const auto lock = qt_scoped_lock(g_onBindListenerMutex); + if (g_onBindListener) + return g_onBindListener->onBind(intent); return nullptr; } -Q_GLOBAL_STATIC(QAtomicInt, g_androidDeadlockProtector); +Q_CONSTINIT static QBasicAtomicInt g_androidDeadlockProtector = Q_BASIC_ATOMIC_INITIALIZER(0); bool QtAndroidPrivate::acquireAndroidDeadlockProtector() { - return g_androidDeadlockProtector->testAndSetAcquire(0, 1); + return g_androidDeadlockProtector.testAndSetAcquire(0, 1); } void QtAndroidPrivate::releaseAndroidDeadlockProtector() { - g_androidDeadlockProtector->storeRelease(0); + g_androidDeadlockProtector.storeRelease(0); } QT_END_NAMESPACE -Q_CORE_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { Q_UNUSED(reserved); |