summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qjniobject.cpp48
-rw-r--r--src/corelib/kernel/qjniobject.h32
-rw-r--r--tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp167
3 files changed, 247 insertions, 0 deletions
diff --git a/src/corelib/kernel/qjniobject.cpp b/src/corelib/kernel/qjniobject.cpp
index dbca5321a1..319a7ba0d1 100644
--- a/src/corelib/kernel/qjniobject.cpp
+++ b/src/corelib/kernel/qjniobject.cpp
@@ -917,6 +917,25 @@ QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
*/
/*!
+ \fn template <typename T> T QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, ...)
+
+ Calls the static method identified by \a methodId from the class \a clazz
+ with any subsequent arguments. Useful when \a clazz and \a methodId are
+ already cached from previous operations.
+
+ \code
+ QJniEnvironment env;
+ jclass javaMathClass = env.findClass("java/lang/Math");
+ jmethodID methodId = env.findStaticMethod(javaMathClass, "max", "(II)I");
+ if (methodId != 0) {
+ jint a = 2;
+ jint b = 4;
+ jint max = QJniObject::callStaticMethod<jint>(javaMathClass, methodId, a, b);
+ }
+ \endcode
+*/
+
+/*!
\fn template <typename T> T QJniObject::callStaticMethod(jclass clazz, const char *methodName)
Calls the static method \a methodName on \a clazz and returns the value.
@@ -1014,6 +1033,35 @@ QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodNa
}
/*!
+ \fn QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
+
+ Calls the static method identified by \a methodId from the class \a clazz
+ with any subsequent arguments. Useful when \a clazz and \a methodId are
+ already cached from previous operations.
+
+ \code
+ QJniEnvironment env;
+ jclass clazz = env.findClass("java/lang/String");
+ jmethodID methodId = env.findStaticMethod(clazz, "valueOf", "(I)Ljava/lang/String;");
+ if (methodId != 0)
+ QJniObject str = QJniObject::callStaticObjectMethod(clazz, methodId, 10);
+ \endcode
+*/
+QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
+{
+ QJniEnvironment env;
+ if (clazz && methodId) {
+ va_list args;
+ va_start(args, methodId);
+ QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, methodId, args));
+ va_end(args);
+ return res;
+ }
+
+ return QJniObject();
+}
+
+/*!
\fn QJniObject QJniObject::callObjectMethod(const char *methodName) const
Calls the Java objects method \a methodName and returns a new QJniObject for
diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h
index 83d64ad485..187eccc35d 100644
--- a/src/corelib/kernel/qjniobject.h
+++ b/src/corelib/kernel/qjniobject.h
@@ -219,6 +219,36 @@ public:
}
}
+ template <typename T>
+ static T callStaticMethod(jclass clazz, jmethodID methodId, ...)
+ {
+ assertJniPrimitiveType<T>();
+ QJniEnvironment env;
+ T res{};
+ if (clazz && methodId) {
+ va_list args;
+ va_start(args, methodId);
+ callStaticMethodForType<T>(env.jniEnv(), res, clazz, methodId, args);
+ va_end(args);
+ if (env.checkAndClearExceptions())
+ res = {};
+ }
+ return res;
+ }
+
+ template <>
+ void callStaticMethod<void>(jclass clazz, jmethodID methodId, ...)
+ {
+ QJniEnvironment env;
+ if (clazz && methodId) {
+ va_list args;
+ va_start(args, methodId);
+ env->CallStaticVoidMethodV(clazz, methodId, args);
+ va_end(args);
+ env.checkAndClearExceptions();
+ }
+ }
+
template <typename T> static T callStaticMethod(jclass clazz, const char *methodName)
{
assertJniPrimitiveType<T>();
@@ -254,6 +284,8 @@ public:
static QJniObject callStaticObjectMethod(jclass clazz, const char *methodName,
const char *signature, ...);
+ static QJniObject callStaticObjectMethod(jclass clazz, jmethodID methodId, ...);
+
template <typename T> T getField(const char *fieldName) const
{
assertJniPrimitiveType<T>();
diff --git a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
index 7b5c60a7d7..173f955ce7 100644
--- a/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
+++ b/tests/auto/corelib/kernel/qjniobject/tst_qjniobject.cpp
@@ -65,22 +65,31 @@ private slots:
void compareOperatorTests();
void callStaticObjectMethodClassName();
void callStaticObjectMethod();
+ void callStaticObjectMethodById();
void callStaticBooleanMethodClassName();
void callStaticBooleanMethod();
+ void callStaticBooleanMethodById();
void callStaticCharMethodClassName();
void callStaticCharMethod();
+ void callStaticCharMethodById();
void callStaticIntMethodClassName();
void callStaticIntMethod();
+ void callStaticIntMethodById();
void callStaticByteMethodClassName();
void callStaticByteMethod();
+ void callStaticByteMethodById();
void callStaticDoubleMethodClassName();
void callStaticDoubleMethod();
+ void callStaticDoubleMethodById();
void callStaticFloatMethodClassName();
void callStaticFloatMethod();
+ void callStaticFloatMethodById();
void callStaticLongMethodClassName();
void callStaticLongMethod();
+ void callStaticLongMethodById();
void callStaticShortMethodClassName();
void callStaticShortMethod();
+ void callStaticShortMethodById();
void getStaticObjectFieldClassName();
void getStaticObjectField();
void getStaticIntFieldClassName();
@@ -270,6 +279,28 @@ void tst_QJniObject::callStaticObjectMethod()
QCOMPARE(returnedString, QString::fromLatin1("test format"));
}
+void tst_QJniObject::callStaticObjectMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/String");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(
+ cls, "format", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;");
+ QVERIFY(id != 0);
+
+ QJniObject formatString = QJniObject::fromString(QLatin1String("test format"));
+ QVERIFY(formatString.isValid());
+
+ QJniObject returnValue = QJniObject::callStaticObjectMethod(
+ cls, id, formatString.object<jstring>(), jobjectArray(0));
+ QVERIFY(returnValue.isValid());
+
+ QString returnedString = returnValue.toString();
+
+ QCOMPARE(returnedString, QString::fromLatin1("test format"));
+}
+
void tst_QJniObject::callStaticBooleanMethod()
{
QJniEnvironment env;
@@ -299,6 +330,32 @@ void tst_QJniObject::callStaticBooleanMethod()
}
}
+void tst_QJniObject::callStaticBooleanMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Boolean");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseBoolean", "(Ljava/lang/String;)Z");
+ QVERIFY(id != 0);
+
+ {
+ QJniObject parameter = QJniObject::fromString("true");
+ QVERIFY(parameter.isValid());
+
+ jboolean b = QJniObject::callStaticMethod<jboolean>(cls, id, parameter.object<jstring>());
+ QVERIFY(b);
+ }
+
+ {
+ QJniObject parameter = QJniObject::fromString("false");
+ QVERIFY(parameter.isValid());
+
+ jboolean b = QJniObject::callStaticMethod<jboolean>(cls, id, parameter.object<jstring>());
+ QVERIFY(!b);
+ }
+}
+
void tst_QJniObject::callStaticBooleanMethodClassName()
{
{
@@ -352,6 +409,22 @@ void tst_QJniObject::callStaticByteMethod()
QCOMPARE(returnValue, jbyte(number.toInt()));
}
+void tst_QJniObject::callStaticByteMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Byte");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseByte", "(Ljava/lang/String;)B");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jbyte returnValue = QJniObject::callStaticMethod<jbyte>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, jbyte(number.toInt()));
+}
+
void tst_QJniObject::callStaticIntMethodClassName()
{
QString number = QString::number(123);
@@ -381,6 +454,22 @@ void tst_QJniObject::callStaticIntMethod()
QCOMPARE(returnValue, number.toInt());
}
+void tst_QJniObject::callStaticIntMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Integer");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseInt", "(Ljava/lang/String;)I");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jint returnValue = QJniObject::callStaticMethod<jint>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, number.toInt());
+}
+
void tst_QJniObject::callStaticCharMethodClassName()
{
jchar returnValue = QJniObject::callStaticMethod<jchar>("java/lang/Character",
@@ -404,6 +493,19 @@ void tst_QJniObject::callStaticCharMethod()
QCOMPARE(returnValue, jchar('A'));
}
+void tst_QJniObject::callStaticCharMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Character");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "toUpperCase", "(C)C");
+ QVERIFY(id != 0);
+
+ jchar returnValue = QJniObject::callStaticMethod<jchar>(cls, id, jchar('a'));
+ QCOMPARE(returnValue, jchar('A'));
+}
+
void tst_QJniObject::callStaticDoubleMethodClassName ()
{
QString number = QString::number(123.45);
@@ -433,6 +535,23 @@ void tst_QJniObject::callStaticDoubleMethod()
QCOMPARE(returnValue, number.toDouble());
}
+void tst_QJniObject::callStaticDoubleMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Double");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseDouble", "(Ljava/lang/String;)D");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123.45);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jdouble returnValue =
+ QJniObject::callStaticMethod<jdouble>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, number.toDouble());
+}
+
void tst_QJniObject::callStaticFloatMethodClassName()
{
QString number = QString::number(123.45);
@@ -462,6 +581,22 @@ void tst_QJniObject::callStaticFloatMethod()
QCOMPARE(returnValue, number.toFloat());
}
+void tst_QJniObject::callStaticFloatMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Float");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseFloat", "(Ljava/lang/String;)F");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123.45);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jfloat returnValue = QJniObject::callStaticMethod<jfloat>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, number.toFloat());
+}
+
void tst_QJniObject::callStaticShortMethodClassName()
{
QString number = QString::number(123);
@@ -491,6 +626,22 @@ void tst_QJniObject::callStaticShortMethod()
QCOMPARE(returnValue, number.toShort());
}
+void tst_QJniObject::callStaticShortMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Short");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseShort", "(Ljava/lang/String;)S");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jshort returnValue = QJniObject::callStaticMethod<jshort>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, number.toShort());
+}
+
void tst_QJniObject::callStaticLongMethodClassName()
{
QString number = QString::number(123);
@@ -519,6 +670,22 @@ void tst_QJniObject::callStaticLongMethod()
QCOMPARE(returnValue, jlong(number.toLong()));
}
+void tst_QJniObject::callStaticLongMethodById()
+{
+ QJniEnvironment env;
+ jclass cls = env.findClass("java/lang/Long");
+ QVERIFY(cls != 0);
+
+ jmethodID id = env.findStaticMethod(cls, "parseLong", "(Ljava/lang/String;)J");
+ QVERIFY(id != 0);
+
+ QString number = QString::number(123);
+ QJniObject parameter = QJniObject::fromString(number);
+
+ jlong returnValue = QJniObject::callStaticMethod<jlong>(cls, id, parameter.object<jstring>());
+ QCOMPARE(returnValue, jlong(number.toLong()));
+}
+
void tst_QJniObject::getStaticObjectFieldClassName()
{
{