From 45daea19c393259297973ce99ce8717965e62224 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Tue, 4 May 2021 20:02:22 +0300 Subject: [PATCH] Fix set*Field JNI template calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The calls were trying to pass a JNIEnv* from a QJniEnvironment using conversion operator which was removed, and weren't detected since they are templates and were missing tests. This fix that and add test cases for setField() and setStaticField() calls. Pick-to: 6.1 Change-Id: I6e1e6b7f557bbc664248ad364c48d63f58b70756 Reviewed-by: Tor Arne Vestbø --- src/corelib/kernel/qjniobject.h | 12 +- .../testdata/QtJniObjectTestClass.java | 22 +++ .../kernel/qjniobject/tst_qjniobject.cpp | 142 ++++++++++++++++++ 3 files changed, 170 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h index 187eccc35d..011a1c0185 100644 --- a/src/corelib/kernel/qjniobject.h +++ b/src/corelib/kernel/qjniobject.h @@ -381,7 +381,7 @@ public: constexpr const char *signature = getTypeSignature(); jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature); if (id) { - setFieldForType(env, object(), id, value); + setFieldForType(env.jniEnv(), object(), id, value); env.checkAndClearExceptions(); } } @@ -393,7 +393,7 @@ public: QJniEnvironment env; jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature); if (id) { - setFieldForType(env, object(), id, value); + setFieldForType(env.jniEnv(), object(), id, value); env.checkAndClearExceptions(); } } @@ -413,7 +413,7 @@ public: if (!id) return; - setStaticFieldForType(env, clazz, id, value); + setStaticFieldForType(env.jniEnv(), clazz, id, value); env.checkAndClearExceptions(); } @@ -431,7 +431,7 @@ public: jfieldID id = getCachedFieldID(env.jniEnv(), clazz, className, fieldName, signature, true); if (id) { - setStaticFieldForType(env, clazz, id, value); + setStaticFieldForType(env.jniEnv(), clazz, id, value); env.checkAndClearExceptions(); } } @@ -445,7 +445,7 @@ public: jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true); if (id) { - setStaticFieldForType(env, clazz, id, value); + setStaticFieldForType(env.jniEnv(), clazz, id, value); env.checkAndClearExceptions(); } } @@ -458,7 +458,7 @@ public: constexpr const char *signature = getTypeSignature(); jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true); if (id) { - setStaticFieldForType(env, clazz, id, value); + setStaticFieldForType(env.jniEnv(), clazz, id, value); env.checkAndClearExceptions(); } } diff --git a/tests/auto/corelib/kernel/qjniobject/testdata/src/org/qtproject/qt/android/testdata/QtJniObjectTestClass.java b/tests/auto/corelib/kernel/qjniobject/testdata/src/org/qtproject/qt/android/testdata/QtJniObjectTestClass.java index 4d6db749a5..5865391ac9 100644 --- a/tests/auto/corelib/kernel/qjniobject/testdata/src/org/qtproject/qt/android/testdata/QtJniObjectTestClass.java +++ b/tests/auto/corelib/kernel/qjniobject/testdata/src/org/qtproject/qt/android/testdata/QtJniObjectTestClass.java @@ -43,6 +43,28 @@ public class QtJniObjectTestClass static final Object A_OBJECT_OBJECT = new QtJniObjectTestClass(); static final Throwable A_THROWABLE_OBJECT = new Throwable(A_STRING_OBJECT); + // -------------------------------------------------------------------------------------------- + + byte BYTE_VAR; + short SHORT_VAR; + int INT_VAR; + long LONG_VAR; + float FLOAT_VAR; + double DOUBLE_VAR; + boolean BOOLEAN_VAR; + char CHAR_VAR; + String STRING_OBJECT_VAR; + + static byte S_BYTE_VAR; + static short S_SHORT_VAR; + static int S_INT_VAR; + static long S_LONG_VAR; + static float S_FLOAT_VAR; + static double S_DOUBLE_VAR; + static boolean S_BOOLEAN_VAR; + static char S_CHAR_VAR; + static String S_STRING_OBJECT_VAR; + // -------------------------------------------------------------------------------------------- public static void staticVoidMethod() { return; } public static void staticVoidMethodWithArgs(int a, boolean b, char c) { return; } diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp index 173f955ce7..4c0d9e1e6e 100644 --- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp +++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp @@ -108,6 +108,26 @@ private slots: void getStaticCharField(); void getBooleanField(); void getIntField(); + + void setIntField(); + void setByteField(); + void setLongField(); + void setDoubleField(); + void setFloatField(); + void setShortField(); + void setCharField(); + void setBooleanField(); + void setObjectField(); + void setStaticIntField(); + void setStaticByteField(); + void setStaticLongField(); + void setStaticDoubleField(); + void setStaticFloatField(); + void setStaticShortField(); + void setStaticCharField(); + void setStaticBooleanField(); + void setStaticObjectField(); + void templateApiCheck(); void isClassAvailable(); void fromLocalRef(); @@ -889,6 +909,128 @@ void tst_QJniObject::getIntField() QCOMPARE(res, -1); } +template +void setField(const char *fieldName, T testValue) +{ + QJniObject obj(testClassName); + QVERIFY(obj.isValid()); + + obj.setField(fieldName, testValue); + + T res = obj.getField(fieldName); + QCOMPARE(res, testValue); +} + +void tst_QJniObject::setIntField() +{ + setField("INT_VAR", 555); +} + +void tst_QJniObject::setByteField() +{ + setField("BYTE_VAR", jbyte(555)); +} + +void tst_QJniObject::setLongField() +{ + setField("LONG_VAR", jlong(9223372036847758232L)); +} + +void tst_QJniObject::setDoubleField() +{ + setField("DOUBLE_VAR", jdouble(1.2)); +} + +void tst_QJniObject::setFloatField() +{ + setField("FLOAT_VAR", jfloat(1.2)); +} + +void tst_QJniObject::setShortField() +{ + setField("SHORT_VAR", jshort(123)); +} + +void tst_QJniObject::setCharField() +{ + setField("CHAR_VAR", jchar('A')); +} + +void tst_QJniObject::setBooleanField() +{ + setField("BOOLEAN_VAR", jboolean(true)); +} + +void tst_QJniObject::setObjectField() +{ + QJniObject obj(testClassName); + QVERIFY(obj.isValid()); + + QJniObject testValue = QJniObject::fromString(QStringLiteral("Hello")); + obj.setField("STRING_OBJECT_VAR", testValue.object()); + + QJniObject res = obj.getObjectField("STRING_OBJECT_VAR"); + QCOMPARE(res.toString(), testValue.toString()); +} + +template +void setStaticField(const char *fieldName, T testValue) +{ + QJniObject::setStaticField(testClassName, fieldName, testValue); + + T res = QJniObject::getStaticField(testClassName, fieldName); + QCOMPARE(res, testValue); +} + +void tst_QJniObject::setStaticIntField() +{ + setStaticField("S_INT_VAR", 555); +} + +void tst_QJniObject::setStaticByteField() +{ + setStaticField("S_BYTE_VAR", jbyte(555)); +} + +void tst_QJniObject::setStaticLongField() +{ + setStaticField("S_LONG_VAR", jlong(9223372036847758232L)); +} + +void tst_QJniObject::setStaticDoubleField() +{ + setStaticField("S_DOUBLE_VAR", jdouble(1.2)); +} + +void tst_QJniObject::setStaticFloatField() +{ + setStaticField("S_FLOAT_VAR", jfloat(1.2)); +} + +void tst_QJniObject::setStaticShortField() +{ + setStaticField("S_SHORT_VAR", jshort(123)); +} + +void tst_QJniObject::setStaticCharField() +{ + setStaticField("S_CHAR_VAR", jchar('A')); +} + +void tst_QJniObject::setStaticBooleanField() +{ + setStaticField("S_BOOLEAN_VAR", jboolean(true)); +} + +void tst_QJniObject::setStaticObjectField() +{ + QJniObject testValue = QJniObject::fromString(QStringLiteral("Hello")); + QJniObject::setStaticField(testClassName, "S_STRING_OBJECT_VAR", testValue.object()); + + QJniObject res = QJniObject::getStaticObjectField(testClassName, "S_STRING_OBJECT_VAR"); + QCOMPARE(res.toString(), testValue.toString()); +} + void tst_QJniObject::templateApiCheck() { QJniObject testClass(testClassName);