diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index e3e9d0c4dc5..9da9fe2a42b 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -106,6 +106,7 @@ public: template T object() const { return m_object.object(); } bool isValid() const { return m_object.isValid(); } + bool isEmpty() const { return size() == 0; } size_type size() const { @@ -310,6 +311,7 @@ public: return res; } } + auto toContainer() const { JNIEnv *env = jniEnv(); @@ -328,11 +330,15 @@ public: } else if constexpr (std::is_same_v) { const qsizetype bytecount = size(); QByteArray res(bytecount, Qt::Initialization::Uninitialized); - env->GetByteArrayRegion(object(), - 0, bytecount, reinterpret_cast(res.data())); + if (!isEmpty()) { + env->GetByteArrayRegion(object(), + 0, bytecount, reinterpret_cast(res.data())); + } return res; } else { QList res; + if (isEmpty()) + return res; res.resize(size()); if constexpr (std::is_same_v) { env->GetCharArrayRegion(object(), diff --git a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp index 20dfcfd4d76..2f895b7b9ed 100644 --- a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp +++ b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp @@ -17,6 +17,7 @@ public: private slots: void construct(); + void invalidArraysAreEmpty(); void size(); void operators(); }; @@ -126,6 +127,30 @@ void tst_QJniArray::construct() } } +void tst_QJniArray::invalidArraysAreEmpty() +{ + QJniArray invalid; + QVERIFY(!invalid.isValid()); + QCOMPARE(invalid.object(), nullptr); + QVERIFY(invalid.isEmpty()); + + QCOMPARE(invalid.begin(), invalid.end()); + QCOMPARE(invalid.rbegin(), invalid.rend()); + + QList data; + // safe to iterate + for (const auto &e : invalid) + data.emplace_back(e); + QVERIFY(data.empty()); + + // safe to convert + data = invalid.toContainer(); + QVERIFY(data.empty()); + + // unsafe to access + // auto element = invalid.at(0); +} + void tst_QJniArray::size() { QJniArray array;