diff --git a/src/corelib/kernel/qjniobject.cpp b/src/corelib/kernel/qjniobject.cpp index d5b0cd5663a..54b264de4a7 100644 --- a/src/corelib/kernel/qjniobject.cpp +++ b/src/corelib/kernel/qjniobject.cpp @@ -736,6 +736,14 @@ QJniObject::QJniObject(jobject object) QJniObject::~QJniObject() {} +/*! + \fn void QJniObject::swap(QJniObject &other) + \since 6.8 + + Swaps this object with \a other. This function is very fast and never fails. +*/ + + namespace { QByteArray getClassNameHelper(JNIEnv *env, const QJniObjectPrivate *d) { @@ -1385,7 +1393,7 @@ bool QJniObject::isClassAvailable(const char *className) */ bool QJniObject::isValid() const { - return d->m_jobject; + return d && d->m_jobject; } /*! @@ -1411,6 +1419,8 @@ QJniObject QJniObject::fromLocalRef(jobject lref) bool QJniObject::isSameObject(jobject obj) const { + if (!d) + return obj == nullptr; if (d->m_jobject == obj) return true; if (!d->m_jobject || !obj) @@ -1420,6 +1430,8 @@ bool QJniObject::isSameObject(jobject obj) const bool QJniObject::isSameObject(const QJniObject &other) const { + if (!other.isValid()) + return !isValid(); return isSameObject(other.d->m_jobject); } diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h index 45f84afd0d6..9231e2d431b 100644 --- a/src/corelib/kernel/qjniobject.h +++ b/src/corelib/kernel/qjniobject.h @@ -102,6 +102,8 @@ public: ~QJniObject(); + void swap(QJniObject &other) noexcept { d.swap(other.d); } + template static inline QJniObject construct(Args &&...args) { diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp index dcc68e0283c..52418ef9aae 100644 --- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp +++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp @@ -328,6 +328,11 @@ void tst_QJniObject::compareOperatorTests() QVERIFY(jstrobj != stringObject); QVERIFY(stringObject != jstrobj); QVERIFY(!invalidStringObject.isValid()); + + QJniObject movedTo(std::move(stringObject3)); + QVERIFY(!stringObject3.isValid()); + QCOMPARE_NE(movedTo, stringObject3); + QCOMPARE(invalidStringObject, stringObject3); } void tst_QJniObject::className()