summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-05-22 00:55:28 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2022-05-23 21:12:06 +0200
commitdd8da7ebd9f9a2536c9c2925bc5638a29ffc8386 (patch)
tree87589b2257c5dbed31adbd9a852d5baf5e3779c9 /tests/auto
parentfb56a0f2ce34e95d955095c01ecf2943046be85e (diff)
Compile-time generate a JNINativeMethod from a C function
Add a template function that allows us to get the method signature string from a free function, which are used as native callbacks methods from Java. Provide a macro that defines a signature object, and a JNINativeMethod object based on it, in an internal namespace so that we don't pollute the namespace with generated names. Add another macro to get the generated JNINativeMethod object based on the free function name. Lastly, add overloads to QJniEnvironment::registerNativeMethods that take a std::initializer_list of JNINativeMethods. We can now declare a free function to be a JNI native method: static bool callbackFromJava(JNIEnv *e, jobject /*thiz*/, jstring p1) { // ... } Q_JNI_DECLARE_NATIVE_METHOD(callbackFromJava); and register it with the JNI environment like this: QJniEnvironment jni; jni.registerNativeMethods(clazz, { Q_JNI_NATIVE_METHOD(callbackFromJava) }); removing a significant amount of boiler plate code. Change-Id: Ie4007b24125879fed3dae1f4d232b4aa95999b44 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp26
1 files changed, 12 insertions, 14 deletions
diff --git a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
index bcc5556d60..f699d6816a 100644
--- a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
+++ b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp
@@ -98,12 +98,14 @@ static void callbackFromJava(JNIEnv *env, jobject /*thiz*/, jstring value)
Q_UNUSED(env)
registerNativesString = QJniObject(value).toString();
}
+Q_JNI_DECLARE_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);
void tst_QJniEnvironment::registerNativeMethods()
{
@@ -111,11 +113,9 @@ void tst_QJniEnvironment::registerNativeMethods()
QJniEnvironment env;
{
- const JNINativeMethod methods[] {
- {"callbackFromJava", "(Ljava/lang/String;)V", reinterpret_cast<void *>(callbackFromJava)}
- };
-
- QVERIFY(env.registerNativeMethods(javaTestClass, methods, 1));
+ QVERIFY(env.registerNativeMethods(javaTestClass, {
+ Q_JNI_NATIVE_METHOD(callbackFromJava)
+ }));
QJniObject::callStaticMethod<void>(javaTestClass,
"appendJavaToString",
@@ -127,10 +127,9 @@ void tst_QJniEnvironment::registerNativeMethods()
// No default constructor in class
{
- const JNINativeMethod methods[] {{"callbackFromJavaNoCtor", "(Ljava/lang/String;)V",
- reinterpret_cast<void *>(callbackFromJavaNoCtor)}};
-
- QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, methods, 1));
+ QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, {
+ Q_JNI_NATIVE_METHOD(callbackFromJavaNoCtor)
+ }));
QJniObject::callStaticMethod<void>(javaTestClassNoCtor,
"appendJavaToString",
@@ -146,17 +145,16 @@ static void intCallbackFromJava(JNIEnv *env, jobject /*thiz*/, jint value)
Q_UNUSED(env)
registerNativeInteger = static_cast<int>(value);
}
+Q_JNI_DECLARE_NATIVE_METHOD(intCallbackFromJava);
void tst_QJniEnvironment::registerNativeMethodsByJclass()
{
- const JNINativeMethod methods[] {
- { "intCallbackFromJava", "(I)V", reinterpret_cast<void *>(intCallbackFromJava) }
- };
-
QJniEnvironment env;
jclass clazz = env.findClass(javaTestClass);
QVERIFY(clazz != 0);
- QVERIFY(env.registerNativeMethods(clazz, methods, 1));
+ QVERIFY(env.registerNativeMethods(clazz, {
+ Q_JNI_NATIVE_METHOD(intCallbackFromJava)
+ }));
QCOMPARE(registerNativeInteger, 0);