diff options
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformwindow.cpp')
| -rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 4c76bfb3d48..1362b7d3929 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -96,6 +96,7 @@ void QAndroidPlatformWindow::initialize() QAndroidPlatformWindow::~QAndroidPlatformWindow() { + const auto guard = destructionGuard(); if (window()->isTopLevel()) platformScreen()->removeWindow(this); } @@ -353,6 +354,9 @@ void QAndroidPlatformWindow::setSurface(JNIEnv *env, jobject object, jint window continue; QAndroidPlatformWindow *platformWindow = static_cast<QAndroidPlatformWindow *>(window->handle()); + const auto guard = platformWindow->destructionGuard(); + if (!platformWindow->m_surfaceCreated) + continue; if (platformWindow->nativeViewId() == windowId) platformWindow->onSurfaceChanged(surface); } @@ -373,6 +377,18 @@ void QAndroidPlatformWindow::windowFocusChanged(JNIEnv *env, jobject object, } } +/* + Due to calls originating from Android, it is possible for native methods to + try to manipulate any given instance of QAndroidPlatformWindow when it is + already being destroyed. So we use this to guard against that. It is called + in the destructor, and should also be called in any function registered to + be called from java that may touch an instance of QAndroidPlatformWindow. + */ +QMutexLocker<QMutex> QAndroidPlatformWindow::destructionGuard() +{ + return QMutexLocker(&m_destructionMutex); +} + bool QAndroidPlatformWindow::registerNatives(QJniEnvironment &env) { if (!env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtWindow>::className(), |
