diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-06-09 17:30:54 +0300 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-06-09 17:30:54 +0300 |
commit | da6e958319e95fe564d3b30c931492dd666bfaff (patch) | |
tree | 16ac1556a573daeba5c9c4b795f86aa166ffe467 /src/corelib/kernel/qjnihelpers.cpp | |
parent | 29400a683f96867133b28299c0d0bd6bcf40df35 (diff) | |
parent | a96fc76fa78f3500266b3a34016f9e1bd29b319c (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.11' into tqtc/lts-5.15-opensourcev5.15.11-lts-lgpl
Change-Id: Iac056a5e9f59fc8d1929171c18039aeb45be22b8
Diffstat (limited to 'src/corelib/kernel/qjnihelpers.cpp')
-rw-r--r-- | src/corelib/kernel/qjnihelpers.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index 7d278c69f2..817effe742 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -48,6 +48,7 @@ #include "qcoreapplication.h" #include <QtCore/qrunnable.h> +#include <QReadWriteLock> #include <deque> #include <memory> @@ -80,6 +81,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QtAndroidPrivate::OnBindListener*, g_onBindListener, ( Q_GLOBAL_STATIC(QMutex, g_onBindListenerMutex); Q_GLOBAL_STATIC(QSemaphore, g_waitForServiceSetupSemaphore); Q_GLOBAL_STATIC(QAtomicInt, g_serviceSetupLockers); +Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex); class PermissionsResultClass : public QObject { @@ -326,6 +328,41 @@ static void setNativeActivity(JNIEnv *env, jclass, jobject activity) } } +static jboolean updateNativeActivity(JNIEnv *env, jclass = nullptr) +{ + + jclass jQtNative = env->FindClass("org/qtproject/qt5/android/QtNative"); + if (exceptionCheck(env)) + return JNI_FALSE; + + jmethodID activityMethodID = + env->GetStaticMethodID(jQtNative, "activity", "()Landroid/app/Activity;"); + if (exceptionCheck(env)) + return JNI_FALSE; + + jobject activity = env->CallStaticObjectMethod(jQtNative, activityMethodID); + if (exceptionCheck(env)) + return JNI_FALSE; + + QWriteLocker locker(g_updateMutex()); + + if (g_jActivity) { + env->DeleteGlobalRef(g_jActivity); + g_jActivity = nullptr; + } + + if (activity) { + g_jActivity = env->NewGlobalRef(activity); + env->DeleteLocalRef(activity); + } + + env->DeleteLocalRef(jQtNative); + if (exceptionCheck(env)) + return JNI_FALSE; + + return JNI_TRUE; +} + static void setNativeService(JNIEnv *env, jclass, jobject service) { if (g_jService != 0) @@ -402,6 +439,7 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env) {"setNativeActivity", "(Landroid/app/Activity;)V", reinterpret_cast<void *>(setNativeActivity)}, {"setNativeService", "(Landroid/app/Service;)V", reinterpret_cast<void *>(setNativeService)}, {"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V", reinterpret_cast<void *>(sendRequestPermissionsResult)}, + {"updateNativeActivity", "()Z", reinterpret_cast<void *>(updateNativeActivity) }, }; const bool regOk = (env->RegisterNatives(jQtNative, methods, sizeof(methods) / sizeof(methods[0])) == JNI_OK); @@ -423,6 +461,7 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env) jobject QtAndroidPrivate::activity() { + QReadLocker locker(g_updateMutex()); return g_jActivity; } @@ -433,12 +472,13 @@ jobject QtAndroidPrivate::service() jobject QtAndroidPrivate::context() { + QReadLocker locker(g_updateMutex()); if (g_jActivity) return g_jActivity; if (g_jService) return g_jService; - return 0; + return nullptr; } JavaVM *QtAndroidPrivate::javaVM() |