diff options
author | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-11-01 19:54:22 +0200 |
---|---|---|
committer | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-11-15 19:00:21 +0000 |
commit | dfb4b7856a82a72934211d9a1a44626777570d30 (patch) | |
tree | cccc1c93509e09aebf0853e823c0bf92ad8c81dd /tests | |
parent | f3e26891061f26a42d009ec6395f82975019039d (diff) |
Android: check if objectClass() is not null in registerNativeMethods()
In case the class doens't have a default constructor, checking for
object.isValid() will give false because the object won't be created,
however, the class could still be loaded and we could have a valid
jclass.
Pick-to: 6.2
Fixes: QTBUG-96069
Change-Id: I8d59e26d9d7c0e8e363ce443937091a374a24473
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Diffstat (limited to 'tests')
2 files changed, 48 insertions, 12 deletions
diff --git a/tests/auto/corelib/kernel/qjnienvironment/testdata/src/org/qtproject/qt/android/testdata/QtJniEnvironmentTestClass.java b/tests/auto/corelib/kernel/qjnienvironment/testdata/src/org/qtproject/qt/android/testdata/QtJniEnvironmentTestClass.java index 7bf6a7455a..411bd1501d 100644 --- a/tests/auto/corelib/kernel/qjnienvironment/testdata/src/org/qtproject/qt/android/testdata/QtJniEnvironmentTestClass.java +++ b/tests/auto/corelib/kernel/qjnienvironment/testdata/src/org/qtproject/qt/android/testdata/QtJniEnvironmentTestClass.java @@ -49,3 +49,13 @@ public class QtJniEnvironmentTestClass } } +class QtJniEnvironmentTestClassNoCtor +{ + private static native void callbackFromJavaNoCtor(String message); + + public static void appendJavaToString(String message) + { + callbackFromJavaNoCtor("From Java (no ctor): " + message); + } +} + diff --git a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp index 079de48948..8cf207fc3a 100644 --- a/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp +++ b/tests/auto/corelib/kernel/qjnienvironment/tst_qjnienvironment.cpp @@ -34,6 +34,8 @@ static const char javaTestClass[] = "org/qtproject/qt/android/testdatapackage/QtJniEnvironmentTestClass"; +static const char javaTestClassNoCtor[] = + "org/qtproject/qt/android/testdatapackage/QtJniEnvironmentTestClassNoCtor"; static QString registerNativesString = QStringLiteral("Qt"); static int registerNativeInteger = 0; @@ -122,22 +124,46 @@ static void callbackFromJava(JNIEnv *env, jobject /*thiz*/, jstring value) registerNativesString = QJniObject(value).toString(); } -void tst_QJniEnvironment::registerNativeMethods() +static void callbackFromJavaNoCtor(JNIEnv *env, jobject /*thiz*/, jstring value) { - const JNINativeMethod methods[] { - {"callbackFromJava", "(Ljava/lang/String;)V", reinterpret_cast<void *>(callbackFromJava)} - }; + Q_UNUSED(env) + registerNativesString = QJniObject(value).toString(); +} +void tst_QJniEnvironment::registerNativeMethods() +{ + QJniObject QtString = QJniObject::fromString(registerNativesString); QJniEnvironment env; - QVERIFY(env.registerNativeMethods(javaTestClass, methods, 1)); - QJniObject QtString = QJniObject::fromString(registerNativesString); - QJniObject::callStaticMethod<void>(javaTestClass, - "appendJavaToString", - "(Ljava/lang/String;)V", - QtString.object<jstring>()); - QTest::qWait(200); - QVERIFY(registerNativesString == QStringLiteral("From Java: Qt")); + { + const JNINativeMethod methods[] { + {"callbackFromJava", "(Ljava/lang/String;)V", reinterpret_cast<void *>(callbackFromJava)} + }; + + QVERIFY(env.registerNativeMethods(javaTestClass, methods, 1)); + + QJniObject::callStaticMethod<void>(javaTestClass, + "appendJavaToString", + "(Ljava/lang/String;)V", + QtString.object<jstring>()); + QTest::qWait(200); + QVERIFY(registerNativesString == QStringLiteral("From Java: Qt")); + } + + // No default constructor in class + { + const JNINativeMethod methods[] {{"callbackFromJavaNoCtor", "(Ljava/lang/String;)V", + reinterpret_cast<void *>(callbackFromJavaNoCtor)}}; + + QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, methods, 1)); + + QJniObject::callStaticMethod<void>(javaTestClassNoCtor, + "appendJavaToString", + "(Ljava/lang/String;)V", + QtString.object<jstring>()); + QTest::qWait(200); + QVERIFY(registerNativesString == QStringLiteral("From Java (no ctor): Qt")); + } } static void intCallbackFromJava(JNIEnv *env, jobject /*thiz*/, jint value) |