diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2020-11-24 14:09:30 +0100 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2021-01-21 17:03:47 +0100 |
commit | d5eda37baaea20b2411b6ef1ca0d41a2a71a06a6 (patch) | |
tree | d74dcec6dc470c9828bb378e24f5ccae0fbc7dd9 /src | |
parent | 46b892c16c4c9fd10a04bc6d695d1e47bc52a84d (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.cpp | 10 |
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 |