From 8d613f8a9449d2810fd99e71cd6d51932ebb48b7 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Thu, 1 Feb 2024 10:21:48 +0100 Subject: JNI: support construction of QJniArray from std::initializer_list Add implict constructor, treat the list like any other container. Simplify the test code, and explicitly constructor-initialize when we want an array and might have an array, so that we don't end up with constructing arrays of arrays. Change-Id: I14615f897cf8a2188510cfe1085ffc70a2396d5d Reviewed-by: Assam Boudjelthia --- src/corelib/kernel/qjniarray.h | 8 +++++++ src/corelib/kernel/qjniobject.h | 4 ++-- .../corelib/kernel/qjniarray/tst_qjniarray.cpp | 16 +++++++++++++ .../corelib/kernel/qjniobject/tst_qjniobject.cpp | 26 +++++++++++----------- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 9305679b31..976b4e92e3 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -226,6 +226,14 @@ public: { } + template > = true + > + Q_IMPLICIT inline QJniArray(std::initializer_list list) + : QJniArrayBase(QJniArrayBase::fromContainer(list)) + { + } + template , bool> = true> QJniArray(QJniArray &&other) : QJniArrayBase(std::forward>(other)) diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h index 7c6eefc082..3a02c0e31e 100644 --- a/src/corelib/kernel/qjniobject.h +++ b/src/corelib/kernel/qjniobject.h @@ -837,7 +837,7 @@ auto QJniObject::LocalFrame::convertFromJni(QJniObject &&object) if constexpr (std::is_same_v) { return object.toString(); } else if constexpr (QtJniTypes::IsJniArray::value) { - return T{object}; + return T(std::move(object)); } else if constexpr (QJniArrayBase::canConvert) { // if we were to create a QJniArray from Type... using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::declval())); @@ -847,7 +847,7 @@ auto QJniObject::LocalFrame::convertFromJni(QJniObject &&object) return QJniArray(object.template object()).toContainer(); } else if constexpr (std::is_array_v) { using ElementType = std::remove_extent_t; - return QJniArray{object}; + return QJniArray(std::move(object)); } else if constexpr (std::is_base_of_v && !std::is_same_v) { return T{std::move(object)}; diff --git a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp index 10c8b016fc..b7b1f95b39 100644 --- a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp +++ b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp @@ -75,6 +75,10 @@ VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QString, QString); +VERIFY_RETURN_FOR_TYPE(List, List); +VERIFY_RETURN_FOR_TYPE(List[], QJniArray); +VERIFY_RETURN_FOR_TYPE(QJniArray, QJniArray); + void tst_QJniArray::construct() { { @@ -84,6 +88,18 @@ void tst_QJniArray::construct() QJniArray list(strings); QCOMPARE(list.size(), 10000); } + { + QJniArray list{1, 2, 3}; + QCOMPARE(list.size(), 3); + } + { + QJniArray list(QList{1, 2, 3}); + QCOMPARE(list.size(), 3); + } + { + QJniArray list{QList{1, 2, 3}}; + QCOMPARE(list.size(), 3); + } } void tst_QJniArray::size() diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp index 29f6b04f09..36a836516c 100644 --- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp +++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp @@ -1624,7 +1624,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{u'a', u'b', u'c'})); - QJniArray newArray(QList{u'c', u'b', u'a'}); + QJniArray newArray = {u'c', u'b', u'a'}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseCharArray", newArray); QVERIFY(reverse.isValid()); @@ -1644,7 +1644,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{u'a', u'b', u'c'})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{u'c', u'b', u'a'}); + QJniArray newArray = {u'c', u'b', u'a'}; QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseCharArray", newArray); QVERIFY(reverse.isValid()); @@ -1662,7 +1662,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseShortArray", newArray); QVERIFY(reverse.isValid()); @@ -1682,7 +1682,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; static_assert(std::is_same_v); QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseShortArray", newArray); @@ -1701,7 +1701,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseIntArray", newArray); QVERIFY(reverse.isValid()); @@ -1717,7 +1717,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseIntArray", newArray); QVERIFY(reverse.isValid()); @@ -1735,7 +1735,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseLongArray", newArray); QVERIFY(reverse.isValid()); @@ -1751,7 +1751,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3, 2, 1})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{3, 2, 1}); + QJniArray newArray = {3, 2, 1}; QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseLongArray", newArray); QVERIFY(reverse.isValid()); @@ -1769,7 +1769,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{1.0f, 2.0f, 3.0f})); - QJniArray newArray(QList{3.0f, 2.0f, 1.0f}); + QJniArray newArray = {3.0f, 2.0f, 1.0f}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseFloatArray", newArray); QVERIFY(reverse.isValid()); @@ -1785,7 +1785,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{1.0f, 2.0f, 3.0f})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{3.0f, 2.0f, 1.0f}); + QJniArray newArray = {3.0f, 2.0f, 1.0f}; QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseFloatArray", newArray); QVERIFY(reverse.isValid()); @@ -1803,7 +1803,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3.0, 2.0, 1.0})); - QJniArray newArray(QList{3.0, 2.0, 1.0}); + QJniArray newArray = {3.0, 2.0, 1.0}; QVERIFY(newArray.isValid()); const auto reverse = TestClass::callStaticMethod("staticReverseDoubleArray", newArray); QVERIFY(reverse.isValid()); @@ -1819,7 +1819,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), (QList{3.0, 2.0, 1.0})); - QJniArray newArray = QJniArrayBase::fromContainer(QList{3.0, 2.0, 1.0}); + QJniArray newArray = {3.0, 2.0, 1.0}; QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseDoubleArray", newArray); QVERIFY(reverse.isValid()); @@ -2039,7 +2039,7 @@ void tst_QJniObject::callback() QVERIFY(TestClass::registerNativeMethods({ Q_JNI_NATIVE_METHOD(callbackWithJniArray) })); - const QJniArray doubles = QJniArrayBase::fromContainer(QList{ 1.2, 3.4, 5.6 }); + const QJniArray doubles = { 1.2, 3.4, 5.6 }; result = testObject.callMethod("callMeBackWithJniArray", doubles); QVERIFY(calledWithJniArray); QCOMPARE(calledWithJniArray, doubles); -- cgit v1.2.3