summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2020-11-24 14:09:30 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2021-01-21 17:03:47 +0100
commitd5eda37baaea20b2411b6ef1ca0d41a2a71a06a6 (patch)
treed74dcec6dc470c9828bb378e24f5ccae0fbc7dd9 /src
parent46b892c16c4c9fd10a04bc6d695d1e47bc52a84d (diff)
Hold references to zone IDs alive during use
Restore holding of a getID() call's return in a QJNIObjectPrivate eliminated in commit 78cde1bfd94521bbe4972f31a79c959d0990ea77; this keeps the Java internal object alive for its lifetime, where it might otherwise be garbage-collected before we're done with it. Fixes: QTBUG-88610 Pick-to: 5.15 6.0 Change-Id: Id65b059012f7bd3377a6562c1b647feb75a13679 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/time/qtimezoneprivate_android.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp
index e182ac27ec..da82832455 100644
--- a/src/corelib/time/qtimezoneprivate_android.cpp
+++ b/src/corelib/time/qtimezoneprivate_android.cpp
@@ -48,6 +48,10 @@ QT_BEGIN_NAMESPACE
Private
Android implementation
+
+ Note that a QJNIObjectPrivate manages a global reference, so it serves as an
+ owning smart-pointer, ensuring an object doesn't get garbage-collected
+ before we're done with it.
*/
// Create the system default time zone
@@ -57,7 +61,8 @@ QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
// Keep in sync with systemTimeZoneId():
androidTimeZone = QJNIObjectPrivate::callStaticObjectMethod(
"java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- m_id = androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;").toString().toUtf8();
+ const QJNIObjectPrivate id = androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;");
+ m_id = id.toString().toUtf8();
}
// Create a named time zone
@@ -247,7 +252,8 @@ QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const
// Keep in sync with default constructor:
QJNIObjectPrivate androidSystemTimeZone = QJNIObjectPrivate::callStaticObjectMethod(
"java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- return androidSystemTimeZone.callObjectMethod<jstring>("getID").toString().toUtf8();
+ const QJNIObjectPrivate id = androidSystemTimeZone.callObjectMethod<jstring>("getID");
+ return id.toString().toUtf8();
}
QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const