qtbase/src/plugins/platforms/android/androidbackendregister.cpp
Lars Schmertmann 9903242eca Android: Fix freeze on start when the activity was destroyed before
This can be tested by enabling "Don't keep activities" in the developer
options. With this option Android will immediately destroy the activity
when it is moved to the background. In this case registerBackends will
be called the first time before the BackendRegister was created. Because
m_backendsRegistered was set to true even if it failed, the final call has
no effect. So we need to ensure to set m_backendsRegistered only if a
BackendRegister is available.

Fixes: QTBUG-132085
Pick-to: 6.9 6.8
Change-Id: I2ea1c0e0737c982594ceb06cbaf540399c45e3f4
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
2025-01-04 15:47:29 +01:00

59 lines
2.1 KiB
C++

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "androidbackendregister.h"
#include "androidjnimain.h"
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcAndroidBackendRegister, "qt.qpa.androidbackendregister")
Q_DECLARE_JNI_CLASS(BackendRegister, "org/qtproject/qt/android/BackendRegister");
bool AndroidBackendRegister::registerNatives()
{
return QtJniTypes::BackendRegister::registerNativeMethods(
{ Q_JNI_NATIVE_SCOPED_METHOD(isNull, AndroidBackendRegister),
Q_JNI_NATIVE_SCOPED_METHOD(registerBackend, AndroidBackendRegister),
Q_JNI_NATIVE_SCOPED_METHOD(unregisterBackend, AndroidBackendRegister) });
}
jboolean AndroidBackendRegister::isNull(JNIEnv *, jclass)
{
return QtAndroid::backendRegister() == nullptr;
}
void AndroidBackendRegister::registerBackend(JNIEnv *, jclass, jclass interfaceClass,
jobject interface)
{
if (AndroidBackendRegister *reg = QtAndroid::backendRegister()) {
const QJniObject classObject(static_cast<jobject>(interfaceClass));
QString name = classObject.callMethod<jstring>("getName").toString();
name.replace('.', '/');
QMutexLocker lock(&reg->m_registerMutex);
reg->m_register[name] = QJniObject(interface);
} else {
qCWarning(lcAndroidBackendRegister)
<< "AndroidBackendRegister pointer is null, cannot register functionality";
}
}
void AndroidBackendRegister::unregisterBackend(JNIEnv *, jclass, jclass interfaceClass)
{
if (AndroidBackendRegister *reg = QtAndroid::backendRegister()) {
const QJniObject classObject(static_cast<jobject>(interfaceClass));
QString name = classObject.callMethod<jstring>("getName").toString();
name.replace('.', '/');
QMutexLocker lock(&reg->m_registerMutex);
reg->m_register.remove(name);
} else {
qCWarning(lcAndroidBackendRegister)
<< "AndroidBackendRegister pointer is null, cannot unregister functionality";
}
}
QT_END_NAMESPACE