Quick for Android: Call quitQt() after main() exits
In Quick for Android case, if Qt exits itself (Qt.exit() in QML, etc), we get deadlock in startQtApplication after the user-provided main() exits. This is due to terminateQt waiting for a semaphore that - in a normal Q4A context - is called when the hosting Activity itself is destroyed from another thread via an activity status callback. Task-number: QTBUG-130342 Change-Id: I9cd701e0ea86a445e13a6568c4954de6e356e98a Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
parent
3bcf55daa5
commit
dad9ce46f0
@ -378,6 +378,7 @@ public class QtNative
|
||||
|
||||
static void quitQt()
|
||||
{
|
||||
runAction(() -> {
|
||||
terminateQt();
|
||||
m_stateDetails.isStarted = false;
|
||||
notifyAppStateDetailsChanged(m_stateDetails);
|
||||
@ -385,6 +386,7 @@ public class QtNative
|
||||
synchronized (m_qtThreadLock) {
|
||||
m_qtThread = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@UsedFromNativeCode
|
||||
|
@ -471,8 +471,10 @@ static void startQtApplication(JNIEnv */*env*/, jclass /*clazz*/)
|
||||
qWarning() << "dlclose failed:" << dlerror();
|
||||
}
|
||||
|
||||
if (m_applicationClass && QtAndroid::isQtApplication())
|
||||
QJniObject::callStaticMethod<void>(m_applicationClass, "quitApp", "()V");
|
||||
if (m_applicationClass) {
|
||||
const auto quitMethodName = QtAndroid::isQtApplication() ? "quitApp" : "quitQt";
|
||||
QJniObject::callStaticMethod<void>(m_applicationClass, quitMethodName);
|
||||
}
|
||||
|
||||
sem_post(&m_terminateSemaphore);
|
||||
sem_wait(&m_exitSemaphore);
|
||||
|
Loading…
x
Reference in New Issue
Block a user