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 <assam.boudjelthia@qt.io>
This commit is contained in:
parent
9379b634a8
commit
8d613f8a94
@ -226,6 +226,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename E = T
|
||||||
|
, IfCanConvert<std::initializer_list<E>> = true
|
||||||
|
>
|
||||||
|
Q_IMPLICIT inline QJniArray(std::initializer_list<T> list)
|
||||||
|
: QJniArrayBase(QJniArrayBase::fromContainer(list))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Other, std::enable_if_t<std::is_convertible_v<Other, Type>, bool> = true>
|
template <typename Other, std::enable_if_t<std::is_convertible_v<Other, Type>, bool> = true>
|
||||||
QJniArray(QJniArray<Other> &&other)
|
QJniArray(QJniArray<Other> &&other)
|
||||||
: QJniArrayBase(std::forward<QJniArray<Other>>(other))
|
: QJniArrayBase(std::forward<QJniArray<Other>>(other))
|
||||||
|
@ -837,7 +837,7 @@ auto QJniObject::LocalFrame<Args...>::convertFromJni(QJniObject &&object)
|
|||||||
if constexpr (std::is_same_v<Type, QString>) {
|
if constexpr (std::is_same_v<Type, QString>) {
|
||||||
return object.toString();
|
return object.toString();
|
||||||
} else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
|
} else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
|
||||||
return T{object};
|
return T(std::move(object));
|
||||||
} else if constexpr (QJniArrayBase::canConvert<Type>) {
|
} else if constexpr (QJniArrayBase::canConvert<Type>) {
|
||||||
// if we were to create a QJniArray from Type...
|
// if we were to create a QJniArray from Type...
|
||||||
using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::declval<Type>()));
|
using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::declval<Type>()));
|
||||||
@ -847,7 +847,7 @@ auto QJniObject::LocalFrame<Args...>::convertFromJni(QJniObject &&object)
|
|||||||
return QJniArray<ElementType>(object.template object<jarray>()).toContainer();
|
return QJniArray<ElementType>(object.template object<jarray>()).toContainer();
|
||||||
} else if constexpr (std::is_array_v<Type>) {
|
} else if constexpr (std::is_array_v<Type>) {
|
||||||
using ElementType = std::remove_extent_t<Type>;
|
using ElementType = std::remove_extent_t<Type>;
|
||||||
return QJniArray<ElementType>{object};
|
return QJniArray<ElementType>(std::move(object));
|
||||||
} else if constexpr (std::is_base_of_v<QJniObject, Type>
|
} else if constexpr (std::is_base_of_v<QJniObject, Type>
|
||||||
&& !std::is_same_v<QJniObject, Type>) {
|
&& !std::is_same_v<QJniObject, Type>) {
|
||||||
return T{std::move(object)};
|
return T{std::move(object)};
|
||||||
|
@ -75,6 +75,10 @@ VERIFY_RETURN_FOR_TYPE(QList<double>, QList<double>);
|
|||||||
|
|
||||||
VERIFY_RETURN_FOR_TYPE(QString, QString);
|
VERIFY_RETURN_FOR_TYPE(QString, QString);
|
||||||
|
|
||||||
|
VERIFY_RETURN_FOR_TYPE(List, List);
|
||||||
|
VERIFY_RETURN_FOR_TYPE(List[], QJniArray<List>);
|
||||||
|
VERIFY_RETURN_FOR_TYPE(QJniArray<List>, QJniArray<List>);
|
||||||
|
|
||||||
void tst_QJniArray::construct()
|
void tst_QJniArray::construct()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -84,6 +88,18 @@ void tst_QJniArray::construct()
|
|||||||
QJniArray<QString> list(strings);
|
QJniArray<QString> list(strings);
|
||||||
QCOMPARE(list.size(), 10000);
|
QCOMPARE(list.size(), 10000);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
QJniArray<jint> list{1, 2, 3};
|
||||||
|
QCOMPARE(list.size(), 3);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
QJniArray<jint> list(QList<int>{1, 2, 3});
|
||||||
|
QCOMPARE(list.size(), 3);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
QJniArray<jint> list{QList<int>{1, 2, 3}};
|
||||||
|
QCOMPARE(list.size(), 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QJniArray::size()
|
void tst_QJniArray::size()
|
||||||
|
@ -1624,7 +1624,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jchar>{u'a', u'b', u'c'}));
|
QCOMPARE(array.toContainer(), (QList<jchar>{u'a', u'b', u'c'}));
|
||||||
|
|
||||||
QJniArray<jchar> newArray(QList<jchar>{u'c', u'b', u'a'});
|
QJniArray<jchar> newArray = {u'c', u'b', u'a'};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jchar[]>("staticReverseCharArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jchar[]>("staticReverseCharArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1644,7 +1644,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jchar>{u'a', u'b', u'c'}));
|
QCOMPARE(array.toContainer(), (QList<jchar>{u'a', u'b', u'c'}));
|
||||||
|
|
||||||
QJniArray<jchar> newArray = QJniArrayBase::fromContainer(QList<jchar>{u'c', u'b', u'a'});
|
QJniArray<jchar> newArray = {u'c', u'b', u'a'};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jchar[]>("reverseCharArray", newArray);
|
const auto reverse = testClass.callMethod<jchar[]>("reverseCharArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1662,7 +1662,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jshort>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jshort>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jshort> newArray(QList<jshort>{3, 2, 1});
|
QJniArray<jshort> newArray = {3, 2, 1};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jshort[]>("staticReverseShortArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jshort[]>("staticReverseShortArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1682,7 +1682,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jshort>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jshort>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jshort> newArray = QJniArrayBase::fromContainer(QList<jshort>{3, 2, 1});
|
QJniArray<jshort> newArray = {3, 2, 1};
|
||||||
static_assert(std::is_same_v<decltype(newArray)::Type, jshort>);
|
static_assert(std::is_same_v<decltype(newArray)::Type, jshort>);
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jshort[]>("reverseShortArray", newArray);
|
const auto reverse = testClass.callMethod<jshort[]>("reverseShortArray", newArray);
|
||||||
@ -1701,7 +1701,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jint>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jint>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jint> newArray(QList<jint>{3, 2, 1});
|
QJniArray<jint> newArray = {3, 2, 1};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jint[]>("staticReverseIntArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jint[]>("staticReverseIntArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1717,7 +1717,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jint>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jint>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jint> newArray = QJniArrayBase::fromContainer(QList<jint>{3, 2, 1});
|
QJniArray<jint> newArray = {3, 2, 1};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jint[]>("reverseIntArray", newArray);
|
const auto reverse = testClass.callMethod<jint[]>("reverseIntArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1735,7 +1735,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jlong>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jlong>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jlong> newArray(QList<jlong>{3, 2, 1});
|
QJniArray<jlong> newArray = {3, 2, 1};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jlong[]>("staticReverseLongArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jlong[]>("staticReverseLongArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1751,7 +1751,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jlong>{3, 2, 1}));
|
QCOMPARE(array.toContainer(), (QList<jlong>{3, 2, 1}));
|
||||||
|
|
||||||
QJniArray<jlong> newArray = QJniArrayBase::fromContainer(QList<jlong>{3, 2, 1});
|
QJniArray<jlong> newArray = {3, 2, 1};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jlong[]>("reverseLongArray", newArray);
|
const auto reverse = testClass.callMethod<jlong[]>("reverseLongArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1769,7 +1769,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jfloat>{1.0f, 2.0f, 3.0f}));
|
QCOMPARE(array.toContainer(), (QList<jfloat>{1.0f, 2.0f, 3.0f}));
|
||||||
|
|
||||||
QJniArray<jfloat> newArray(QList<jfloat>{3.0f, 2.0f, 1.0f});
|
QJniArray<jfloat> newArray = {3.0f, 2.0f, 1.0f};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jfloat[]>("staticReverseFloatArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jfloat[]>("staticReverseFloatArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1785,7 +1785,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jfloat>{1.0f, 2.0f, 3.0f}));
|
QCOMPARE(array.toContainer(), (QList<jfloat>{1.0f, 2.0f, 3.0f}));
|
||||||
|
|
||||||
QJniArray<jfloat> newArray = QJniArrayBase::fromContainer(QList<jfloat>{3.0f, 2.0f, 1.0f});
|
QJniArray<jfloat> newArray = {3.0f, 2.0f, 1.0f};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jfloat[]>("reverseFloatArray", newArray);
|
const auto reverse = testClass.callMethod<jfloat[]>("reverseFloatArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1803,7 +1803,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jdouble>{3.0, 2.0, 1.0}));
|
QCOMPARE(array.toContainer(), (QList<jdouble>{3.0, 2.0, 1.0}));
|
||||||
|
|
||||||
QJniArray<jdouble> newArray(QList<jdouble>{3.0, 2.0, 1.0});
|
QJniArray<jdouble> newArray = {3.0, 2.0, 1.0};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = TestClass::callStaticMethod<jdouble[]>("staticReverseDoubleArray", newArray);
|
const auto reverse = TestClass::callStaticMethod<jdouble[]>("staticReverseDoubleArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -1819,7 +1819,7 @@ void tst_QJniObject::templateApiCheck()
|
|||||||
QCOMPARE(array.size(), 3);
|
QCOMPARE(array.size(), 3);
|
||||||
QCOMPARE(array.toContainer(), (QList<jdouble>{3.0, 2.0, 1.0}));
|
QCOMPARE(array.toContainer(), (QList<jdouble>{3.0, 2.0, 1.0}));
|
||||||
|
|
||||||
QJniArray<jdouble> newArray = QJniArrayBase::fromContainer(QList<jdouble>{3.0, 2.0, 1.0});
|
QJniArray<jdouble> newArray = {3.0, 2.0, 1.0};
|
||||||
QVERIFY(newArray.isValid());
|
QVERIFY(newArray.isValid());
|
||||||
const auto reverse = testClass.callMethod<jdouble[]>("reverseDoubleArray", newArray);
|
const auto reverse = testClass.callMethod<jdouble[]>("reverseDoubleArray", newArray);
|
||||||
QVERIFY(reverse.isValid());
|
QVERIFY(reverse.isValid());
|
||||||
@ -2039,7 +2039,7 @@ void tst_QJniObject::callback()
|
|||||||
QVERIFY(TestClass::registerNativeMethods({
|
QVERIFY(TestClass::registerNativeMethods({
|
||||||
Q_JNI_NATIVE_METHOD(callbackWithJniArray)
|
Q_JNI_NATIVE_METHOD(callbackWithJniArray)
|
||||||
}));
|
}));
|
||||||
const QJniArray<double> doubles = QJniArrayBase::fromContainer(QList<double>{ 1.2, 3.4, 5.6 });
|
const QJniArray<double> doubles = { 1.2, 3.4, 5.6 };
|
||||||
result = testObject.callMethod<int>("callMeBackWithJniArray", doubles);
|
result = testObject.callMethod<int>("callMeBackWithJniArray", doubles);
|
||||||
QVERIFY(calledWithJniArray);
|
QVERIFY(calledWithJniArray);
|
||||||
QCOMPARE(calledWithJniArray, doubles);
|
QCOMPARE(calledWithJniArray, doubles);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user