// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include class tst_QJniTypes : public QObject { Q_OBJECT public: tst_QJniTypes() = default; private slots: void initTestCase(); void nativeMethod(); }; struct QtJavaWrapper {}; template<> constexpr auto QtJniTypes::typeSignature() { return QtJniTypes::String("Lorg/qtproject/qt/android/QtJavaWrapper;"); } template<> constexpr auto QtJniTypes::typeSignature() { return QtJniTypes::String("Ljava/lang/Object;"); } struct QtCustomJniObject : QJniObject {}; template<> constexpr auto QtJniTypes::typeSignature() { return QtJniTypes::String("Lorg/qtproject/qt/android/QtCustomJniObject;"); } static_assert(QtJniTypes::typeSignature() == "Lorg/qtproject/qt/android/QtJavaWrapper;"); static_assert(QtJniTypes::typeSignature() != "Ljava/lang/Object;"); static_assert(!(QtJniTypes::typeSignature() == "X")); Q_DECLARE_JNI_TYPE(JavaType, "Lorg/qtproject/qt/JavaType;"); static_assert(QtJniTypes::typeSignature() == "Lorg/qtproject/qt/JavaType;"); Q_DECLARE_JNI_TYPE(ArrayType, "[Lorg/qtproject/qt/ArrayType;") static_assert(QtJniTypes::typeSignature() == "[Lorg/qtproject/qt/ArrayType;"); static_assert(QtJniTypes::className() == "java/lang/String"); Q_DECLARE_JNI_CLASS(QtTextToSpeech, "org/qtproject/qt/android/speech/QtTextToSpeech") static_assert(QtJniTypes::className() == "org/qtproject/qt/android/speech/QtTextToSpeech"); static_assert(QtJniTypes::fieldSignature() == "I"); static_assert(QtJniTypes::fieldSignature() != "X"); static_assert(QtJniTypes::fieldSignature() != "Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "J"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/String;"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "[Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "Lorg/qtproject/qt/android/QtJavaWrapper;"); static_assert(QtJniTypes::fieldSignature() == "Lorg/qtproject/qt/android/QtCustomJniObject;"); static_assert(QtJniTypes::methodSignature() == "()V"); static_assert(QtJniTypes::methodSignature() != "()X"); static_assert(QtJniTypes::methodSignature() == "(I)V"); static_assert(QtJniTypes::methodSignature() == "(ILjava/lang/String;)V"); static_assert(QtJniTypes::methodSignature() == "(ILjava/lang/Class;)J"); static_assert(QtJniTypes::methodSignature() == "(ILjava/lang/String;)Ljava/lang/Object;"); static_assert(QtJniTypes::methodSignature() == "(ILjava/lang/String;)Lorg/qtproject/qt/JavaType;"); static_assert(QtJniTypes::isPrimitiveType()); static_assert(QtJniTypes::isPrimitiveType()); static_assert(!QtJniTypes::isPrimitiveType()); static_assert(!QtJniTypes::isPrimitiveType()); static_assert(!QtJniTypes::isObjectType()); static_assert(!QtJniTypes::isObjectType()); static_assert(QtJniTypes::isObjectType()); static_assert(QtJniTypes::isObjectType()); static_assert(QtJniTypes::isObjectType()); static_assert(QtJniTypes::String("ABCDE").startsWith("ABC")); static_assert(QtJniTypes::String("ABCDE").startsWith("A")); static_assert(QtJniTypes::String("ABCDE").startsWith("ABCDE")); static_assert(!QtJniTypes::String("ABCDE").startsWith("ABCDEF")); static_assert(!QtJniTypes::String("ABCDE").startsWith("9AB")); static_assert(QtJniTypes::String("ABCDE").startsWith('A')); static_assert(!QtJniTypes::String("ABCDE").startsWith('B')); static_assert(QtJniTypes::String("ABCDE").endsWith("CDE")); static_assert(QtJniTypes::String("ABCDE").endsWith("E")); static_assert(QtJniTypes::String("ABCDE").endsWith("ABCDE")); static_assert(!QtJniTypes::String("ABCDE").endsWith("DEF")); static_assert(!QtJniTypes::String("ABCDE").endsWith("ABCDEF")); static_assert(QtJniTypes::String("ABCDE").endsWith('E')); static_assert(!QtJniTypes::String("ABCDE").endsWith('F')); void tst_QJniTypes::initTestCase() { } static bool nativeFunction(JNIEnv *, jclass, int, jstring, long) { return true; } Q_DECLARE_JNI_NATIVE_METHOD(nativeFunction) static_assert(QtJniTypes::nativeMethodSignature(nativeFunction) == "(ILjava/lang/String;J)Z"); void tst_QJniTypes::nativeMethod() { const auto method = Q_JNI_NATIVE_METHOD(nativeFunction); QVERIFY(method.fnPtr == nativeFunction); QCOMPARE(method.name, "nativeFunction"); QCOMPARE(method.signature, "(ILjava/lang/String;J)Z"); } QTEST_MAIN(tst_QJniTypes) #include "tst_qjnitypes.moc"