diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index c97f2234580..e3e9d0c4dc5 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -363,6 +363,13 @@ public: } }; +// Deduction guide so that we can construct as 'QJniArray list(Container)'. Since +// fromContainer() maps several C++ types to the same JNI type (e.g. both jboolean and +// bool become QJniArray), we have to deduce to what fromContainer() would +// give us. +template = true> +QJniArray(Container) -> QJniArray()))::value_type>; + template auto QJniArrayBase::makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion) { diff --git a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp index b7b1f95b394..20dfcfd4d76 100644 --- a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp +++ b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp @@ -81,6 +81,7 @@ VERIFY_RETURN_FOR_TYPE(QJniArray, QJniArray); void tst_QJniArray::construct() { + // explicit { QStringList strings; for (int i = 0; i < 10000; ++i) @@ -89,13 +90,36 @@ void tst_QJniArray::construct() QCOMPARE(list.size(), 10000); } { - QJniArray list{1, 2, 3}; + QJniArray bytes = QJniArrayBase::fromContainer(QByteArray("abc")); + static_assert(std::is_same_v); + QCOMPARE(bytes.size(), 3); + } + { + QJniArray list{1, 2, 3}; + static_assert(std::is_same_v>); QCOMPARE(list.size(), 3); + list = {4, 5}; + QCOMPARE(list.size(), 2); } { QJniArray list(QList{1, 2, 3}); QCOMPARE(list.size(), 3); } + // CTAD with deduction guide + { + QJniArray list(QList{1, 2, 3}); + QCOMPARE(list.size(), 3); + } + { + QJniArray bytes(QByteArray("abc")); + static_assert(std::is_same_v); + QCOMPARE(bytes.size(), 3); + } + { + QStringList strings{"a", "b", "c"}; + QJniArray list(strings); + QCOMPARE(list.size(), 3); + } { QJniArray list{QList{1, 2, 3}}; QCOMPARE(list.size(), 3); @@ -110,7 +134,7 @@ void tst_QJniArray::size() QList intList; intList.resize(10); - auto intArray = QJniArrayBase::fromContainer(intList); + auto intArray = QJniArray(intList); QCOMPARE(intArray.size(), 10); } diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp index 64b464e002e..196874b6a5a 100644 --- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp +++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp @@ -1627,7 +1627,7 @@ void tst_QJniObject::templateApiCheck() QCOMPARE(array.size(), 3); QCOMPARE(array.toContainer(), "abc"); - QJniArray newArray = QJniArrayBase::fromContainer(QByteArray{"cba"}); + QJniArray newArray = QJniArray(QByteArray{"cba"}); QVERIFY(newArray.isValid()); const auto reverse = testClass.callMethod("reverseByteArray", newArray); QVERIFY(reverse.isValid());