From dfb4b7856a82a72934211d9a1a44626777570d30 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 1 Nov 2021 19:54:22 +0200 Subject: 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 --- .../testdata/QtJniEnvironmentTestClass.java | 10 +++++ .../kernel/qjnienvironment/tst_qjnienvironment.cpp | 50 ++++++++++++++++------ 2 files changed, 48 insertions(+), 12 deletions(-) (limited to 'tests/auto/corelib') 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(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(javaTestClass, - "appendJavaToString", - "(Ljava/lang/String;)V", - QtString.object()); - QTest::qWait(200); - QVERIFY(registerNativesString == QStringLiteral("From Java: Qt")); + { + const JNINativeMethod methods[] { + {"callbackFromJava", "(Ljava/lang/String;)V", reinterpret_cast(callbackFromJava)} + }; + + QVERIFY(env.registerNativeMethods(javaTestClass, methods, 1)); + + QJniObject::callStaticMethod(javaTestClass, + "appendJavaToString", + "(Ljava/lang/String;)V", + QtString.object()); + QTest::qWait(200); + QVERIFY(registerNativesString == QStringLiteral("From Java: Qt")); + } + + // No default constructor in class + { + const JNINativeMethod methods[] {{"callbackFromJavaNoCtor", "(Ljava/lang/String;)V", + reinterpret_cast(callbackFromJavaNoCtor)}}; + + QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, methods, 1)); + + QJniObject::callStaticMethod(javaTestClassNoCtor, + "appendJavaToString", + "(Ljava/lang/String;)V", + QtString.object()); + QTest::qWait(200); + QVERIFY(registerNativesString == QStringLiteral("From Java (no ctor): Qt")); + } } static void intCallbackFromJava(JNIEnv *env, jobject /*thiz*/, jint value) -- cgit v1.2.3