summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-05-24 17:20:15 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2022-05-27 22:27:13 +0200
commit31f98957cf5c061f868588ef81059a907c9d30ad (patch)
tree0d6487bbed38198b4f49ee4776473bd0f813a730 /tests
parent9614f4d434474fe7dcca752b3f72a56f2d382230 (diff)
Add compile-time generation of JNI class names
As with method signatures, register class names using template function specialization in the QtJniTypes namespace, and then declare C++ types as JNI classes with a class name string. Such classes implicitly get registered as JNI types as well. Add a QJniObject construct method (since C++ constructors that are templates cannot be explicitly instantiated with a type), and a QJniEnvironment::findClass overload. Add test coverage, also for the recently added macros for native methods. As a drive-by, change the name of the Q_JNI_DECLARE_NATIVE_METHOD macro to Q_DECLARE_JNI_NATIVE_METHOD for consistency. Change-Id: Ic19562d78da726f202b3bdf4e9354e8ad24d8bd9 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp7
-rw-r--r--tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp7
-rw-r--r--tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp22
3 files changed, 32 insertions, 4 deletions
diff --git a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
index f699d6816a..76cad4ddc0 100644
--- a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
+++ b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
@@ -65,6 +65,7 @@ void tst_QJniEnvironment::jniEnv()
// try to find an existing class with QJniEnvironment
QJniEnvironment env;
QVERIFY(env.findClass("java/lang/Object"));
+ QVERIFY(env.findClass<jstring>());
// try to find a nonexistent class
QVERIFY(!env.findClass("this/doesnt/Exist"));
@@ -98,14 +99,14 @@ static void callbackFromJava(JNIEnv *env, jobject /*thiz*/, jstring value)
Q_UNUSED(env)
registerNativesString = QJniObject(value).toString();
}
-Q_JNI_DECLARE_NATIVE_METHOD(callbackFromJava);
+Q_DECLARE_JNI_NATIVE_METHOD(callbackFromJava);
static void callbackFromJavaNoCtor(JNIEnv *env, jobject /*thiz*/, jstring value)
{
Q_UNUSED(env)
registerNativesString = QJniObject(value).toString();
}
-Q_JNI_DECLARE_NATIVE_METHOD(callbackFromJavaNoCtor);
+Q_DECLARE_JNI_NATIVE_METHOD(callbackFromJavaNoCtor);
void tst_QJniEnvironment::registerNativeMethods()
{
@@ -145,7 +146,7 @@ static void intCallbackFromJava(JNIEnv *env, jobject /*thiz*/, jint value)
Q_UNUSED(env)
registerNativeInteger = static_cast<int>(value);
}
-Q_JNI_DECLARE_NATIVE_METHOD(intCallbackFromJava);
+Q_DECLARE_JNI_NATIVE_METHOD(intCallbackFromJava);
void tst_QJniEnvironment::registerNativeMethodsByJclass()
{
diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
index 8faa9b6fbb..e57785c5c5 100644
--- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
+++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
@@ -135,6 +135,11 @@ void tst_QJniObject::ctor()
}
{
+ QJniObject object = QJniObject::construct<jstring>();
+ QVERIFY(object.isValid());
+ }
+
+ {
QJniObject string = QJniObject::fromString(QLatin1String("Hello, Java"));
QJniObject object("java/lang/String", "(Ljava/lang/String;)V", string.object<jstring>());
QVERIFY(object.isValid());
@@ -143,7 +148,7 @@ void tst_QJniObject::ctor()
{
QJniObject string = QJniObject::fromString(QLatin1String("Hello, Java"));
- QJniObject object("java/lang/String", string.object<jstring>());
+ QJniObject object = QJniObject::construct<jstring>(string.object<jstring>());
QVERIFY(object.isValid());
QCOMPARE(string.toString(), object.toString());
}
diff --git a/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp b/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp
index c4abfe399a..395028b8cb 100644
--- a/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp
+++ b/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp
@@ -14,6 +14,7 @@ public:
private slots:
void initTestCase();
+ void nativeMethod();
};
struct QtJavaWrapper {};
@@ -45,6 +46,11 @@ static_assert(QtJniTypes::typeSignature<QtJniTypes::JavaType>() == "Lorg/qtproje
Q_DECLARE_JNI_TYPE(ArrayType, "[Lorg/qtproject/qt/ArrayType;")
static_assert(QtJniTypes::typeSignature<QtJniTypes::ArrayType>() == "[Lorg/qtproject/qt/ArrayType;");
+static_assert(QtJniTypes::className<jstring>() == "java/lang/String");
+
+Q_DECLARE_JNI_CLASS(QtTextToSpeech, "org/qtproject/qt/android/speech/QtTextToSpeech")
+static_assert(QtJniTypes::className<QtJniTypes::QtTextToSpeech>() == "org/qtproject/qt/android/speech/QtTextToSpeech");
+
static_assert(QtJniTypes::fieldSignature<jint>() == "I");
static_assert(QtJniTypes::fieldSignature<jint>() != "X");
static_assert(QtJniTypes::fieldSignature<jint>() != "Ljava/lang/Object;");
@@ -97,6 +103,22 @@ 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"