summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kdab.com>2017-04-10 14:19:12 +0300
committerBogDan Vatra <bogdan@kdab.com>2017-04-10 15:27:20 +0000
commit6c4cbd4122edf8b78f34778400d485b11da98404 (patch)
treed35ba86b1f545fd089b47b72cf623551c527d7f4 /src/plugins/platforms/android
parent2099709a721e2bc72350a02757099df6629475ca (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>
Diffstat (limited to 'src/plugins/platforms/android')
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp27
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp3
2 files changed, 16 insertions, 14 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 17c197ea38..bde7457c0b 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -402,11 +402,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);
}
@@ -584,18 +589,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 155d6bfb8d..3b59b293a5 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -311,10 +311,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);