aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetri Virkkunen <[email protected]>2025-06-17 15:00:02 +0300
committerPetri Virkkunen <[email protected]>2025-06-22 12:37:30 +0000
commit919e9689ff3024b0187f98bff29fd872871aa373 (patch)
treedebfcd518398a068ead48645a19e1856328e09af
parent991d9607b5b61d96126efe3eddc131419533d581 (diff)
QQ4A: Fix crash when rapidly writing and reading QML propertiesHEADdev
QtQuickViewContent calls to QMetaProperty functionality from the Android thread was leading to SIGSEGV crashes Fixes: QTBUG-136235 Pick-to: 6.10 6.9 6.8 Change-Id: Ib1fcebf455b12eee6e7f17fea3235f50d156c60c Reviewed-by: Assam Boudjelthia <[email protected]>
-rw-r--r--src/quick/platform/android/qandroidquickviewembedding.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp
index 0714b1fae4..293667f23b 100644
--- a/src/quick/platform/android/qandroidquickviewembedding.cpp
+++ b/src/quick/platform/android/qandroidquickviewembedding.cpp
@@ -100,7 +100,6 @@ namespace QtAndroidQuickViewEmbedding
return;
}
- QMetaProperty metaProperty = rootMetaObject->property(propertyIndex);
const QJniObject propertyValue(value);
const QVariant variantToWrite = QAndroidTypeConverter::toQVariant(propertyValue);
@@ -108,7 +107,12 @@ namespace QtAndroidQuickViewEmbedding
qWarning("Setting the property type of %s is not supported.",
propertyValue.className().data());
} else {
- metaProperty.write(rootObject, variantToWrite);
+ QMetaObject::invokeMethod(rootObject,
+ [metaProperty = rootMetaObject->property(propertyIndex),
+ rootObject = rootObject,
+ variantToWrite] {
+ metaProperty.write(rootObject, variantToWrite);
+ });
}
}
@@ -134,7 +138,15 @@ namespace QtAndroidQuickViewEmbedding
}
QMetaProperty metaProperty = rootMetaObject->property(propertyIndex);
- const QVariant propertyValue = metaProperty.read(rootObject);
+ QVariant propertyValue;
+ if (QCoreApplication::instance()->thread()->isCurrentThread()) {
+ propertyValue = metaProperty.read(rootObject);
+ } else {
+ QMetaObject::invokeMethod(rootObject,
+ [&propertyValue, &metaProperty, rootObject = rootObject] {
+ propertyValue = metaProperty.read(rootObject);
+ }, Qt::BlockingQueuedConnection);
+ }
jobject jObject = QAndroidTypeConverter::toJavaObject(propertyValue, env);
if (!jObject) {
qWarning("Property %s cannot be converted to a supported Java data type.",