diff options
3 files changed, 52 insertions, 15 deletions
diff --git a/src/corelib/kernel/qjnienvironment.cpp b/src/corelib/kernel/qjnienvironment.cpp index a72078d2cf..9766ff4d3b 100644 --- a/src/corelib/kernel/qjnienvironment.cpp +++ b/src/corelib/kernel/qjnienvironment.cpp @@ -347,11 +347,12 @@ JavaVM *QJniEnvironment::javaVM() bool QJniEnvironment::registerNativeMethods(const char *className, const JNINativeMethod methods[], int size) { - QJniObject classObject(className); + const jclass clazz = findClass(className); - if (!classObject.isValid()) + if (!clazz) return false; - return registerNativeMethods(classObject.objectClass(), methods, size); + + return registerNativeMethods(clazz, methods, size); } #if QT_DEPRECATED_SINCE(6, 2) /*! 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) |