Fix set*Field JNI template calls
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ø <tor.arne.vestbo@qt.io>bb10
parent
afd7460aff
commit
45daea19c3
|
|
@ -381,7 +381,7 @@ public:
|
|||
constexpr const char *signature = getTypeSignature<T>();
|
||||
jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
|
||||
if (id) {
|
||||
setFieldForType<T>(env, object(), id, value);
|
||||
setFieldForType<T>(env.jniEnv(), object(), id, value);
|
||||
env.checkAndClearExceptions();
|
||||
}
|
||||
}
|
||||
|
|
@ -393,7 +393,7 @@ public:
|
|||
QJniEnvironment env;
|
||||
jfieldID id = getCachedFieldID(env.jniEnv(), fieldName, signature);
|
||||
if (id) {
|
||||
setFieldForType<T>(env, object(), id, value);
|
||||
setFieldForType<T>(env.jniEnv(), object(), id, value);
|
||||
env.checkAndClearExceptions();
|
||||
}
|
||||
}
|
||||
|
|
@ -413,7 +413,7 @@ public:
|
|||
if (!id)
|
||||
return;
|
||||
|
||||
setStaticFieldForType<T>(env, clazz, id, value);
|
||||
setStaticFieldForType<T>(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<T>(env, clazz, id, value);
|
||||
setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
|
||||
env.checkAndClearExceptions();
|
||||
}
|
||||
}
|
||||
|
|
@ -445,7 +445,7 @@ public:
|
|||
jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
|
||||
|
||||
if (id) {
|
||||
setStaticFieldForType<T>(env, clazz, id, value);
|
||||
setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
|
||||
env.checkAndClearExceptions();
|
||||
}
|
||||
}
|
||||
|
|
@ -458,7 +458,7 @@ public:
|
|||
constexpr const char *signature = getTypeSignature<T>();
|
||||
jfieldID id = getFieldID(env.jniEnv(), clazz, fieldName, signature, true);
|
||||
if (id) {
|
||||
setStaticFieldForType<T>(env, clazz, id, value);
|
||||
setStaticFieldForType<T>(env.jniEnv(), clazz, id, value);
|
||||
env.checkAndClearExceptions();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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 <typename T>
|
||||
void setField(const char *fieldName, T testValue)
|
||||
{
|
||||
QJniObject obj(testClassName);
|
||||
QVERIFY(obj.isValid());
|
||||
|
||||
obj.setField(fieldName, testValue);
|
||||
|
||||
T res = obj.getField<T>(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<jstring>());
|
||||
|
||||
QJniObject res = obj.getObjectField<jstring>("STRING_OBJECT_VAR");
|
||||
QCOMPARE(res.toString(), testValue.toString());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void setStaticField(const char *fieldName, T testValue)
|
||||
{
|
||||
QJniObject::setStaticField(testClassName, fieldName, testValue);
|
||||
|
||||
T res = QJniObject::getStaticField<T>(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<jstring>());
|
||||
|
||||
QJniObject res = QJniObject::getStaticObjectField<jstring>(testClassName, "S_STRING_OBJECT_VAR");
|
||||
QCOMPARE(res.toString(), testValue.toString());
|
||||
}
|
||||
|
||||
void tst_QJniObject::templateApiCheck()
|
||||
{
|
||||
QJniObject testClass(testClassName);
|
||||
|
|
|
|||
Loading…
Reference in New Issue