From 198a985c094232dce0a7a956004dd2ae1fec68f5 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 24 Nov 2020 14:09:30 +0100 Subject: 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 Change-Id: Id65b059012f7bd3377a6562c1b647feb75a13679 Reviewed-by: BogDan Vatra (cherry picked from commit d5eda37baaea20b2411b6ef1ca0d41a2a71a06a6) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/time/qtimezoneprivate_android.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp index ba87cf79fe..fae9b84fa0 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("getID").toString().toUtf8(); + const QJNIObjectPrivate id = androidSystemTimeZone.callObjectMethod("getID"); + return id.toString().toUtf8(); } QList QAndroidTimeZonePrivate::availableTimeZoneIds() const -- cgit v1.2.3