diff options
author | BogDan Vatra <bogdan@kdab.com> | 2017-04-10 14:19:12 +0300 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2017-04-11 10:04:36 +0000 |
commit | 58ac1fd7a0533eb5ae83b7df2a25afd291c4083c (patch) | |
tree | 74d2842c926f8801c2cffeb777cd92654b0f37d9 | |
parent | ea0c25365744d4da0ab1be5afbb55ebdfe8b2064 (diff) |
Android: Fix crash at exit
We need to remove and release the surface imediately, otherwise
setSurface might be called after the object is deleted.
Task-number: QTBUG-59818
Change-Id: I3a09e3de1ceecc22d8d7a48e2fc1cfe40cf09f0a
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Mathias Hasselmann <mathias.hasselmann@kdab.com>
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
(cherry picked from commit 6c4cbd4122edf8b78f34778400d485b11da98404)
-rw-r--r-- | src/plugins/platforms/android/androidjnimain.cpp | 27 | ||||
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformscreen.cpp | 3 |
2 files changed, 16 insertions, 14 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 8380a97d00..feafc37cf9 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -392,11 +392,16 @@ namespace QtAndroid if (surfaceId == -1) return; - QJNIEnvironmentPrivate env; - if (!env) - return; + { + QMutexLocker lock(&m_surfacesMutex); + const auto &it = m_surfaces.find(surfaceId); + if (it != m_surfaces.end()) + m_surfaces.erase(it); + } - env->CallStaticVoidMethod(m_applicationClass, + QJNIEnvironmentPrivate env; + if (env) + env->CallStaticVoidMethod(m_applicationClass, m_destroySurfaceMethodID, surfaceId); } @@ -567,18 +572,12 @@ static void setSurface(JNIEnv *env, jobject /*thiz*/, jint id, jobject jSurface, { QMutexLocker lock(&m_surfacesMutex); const auto &it = m_surfaces.find(id); - if (it == m_surfaces.end()) { - qWarning()<<"Can't find surface" << id; - return; - } - auto surfaceClient = it.value(); - if (!surfaceClient) // This should never happen... + if (it == m_surfaces.end()) return; - surfaceClient->surfaceChanged(env, jSurface, w, h); - - if (!jSurface) - m_surfaces.erase(it); + auto surfaceClient = it.value(); + if (surfaceClient) + surfaceClient->surfaceChanged(env, jSurface, w, h); } static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/, diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp index 8152f1d53f..221286cbd1 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.cpp +++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp @@ -303,10 +303,13 @@ void QAndroidPlatformScreen::doRedraw() } } if (!hasVisibleRasterWindows) { + lockSurface(); if (m_id != -1) { QtAndroid::destroySurface(m_id); + releaseSurface(); m_id = -1; } + unlockSurface(); return; } QMutexLocker lock(&m_surfaceMutex); |