QJniObject 类

Java Native Interface (JNI) 的便捷包装器。 更多信息...

头文件 #include <QJniObject>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.1

公共函数

QJniObject()
QJniObject(const char *className)
QJniObject(const char *className, const char *signature, ...)
(自 6.4) QJniObject(const char *className, Args &&... args)
QJniObject(jclass clazz)
QJniObject(jclass clazz, const char *signature, ...)
(自 6.4) QJniObject(jclass clazz, Args &&... args)
QJniObject(jobject object)
~QJniObject()
(自 6.4) autocallMethod(const char *methodName, const char *signature, Args &&... args) const
(自 6.4) autocallMethod(const char *methodName, Args &&... args) const
(自 6.4) QJniObjectcallObjectMethod(const char *methodName, Args &&... args) const
QJniObjectcallObjectMethod(const char *methodName, const char *signature, ...) const
(自 6.2) QByteArrayclassName() const
autogetField(const char *fieldName) const
QJniObjectgetObjectField(const char *fieldName) const
QJniObjectgetObjectField(const char *fieldName, const char *signature) const
boolisValid() const
jobjectobject() const
Tobject() const
(自 6.2) jclassobjectClass() const
voidsetField(const char *fieldName, T value)
voidsetField(const char *fieldName, const char *signature, T value)
QStringtoString() const
QJniObject &operator=(T object)

静态公共成员

(自 6.4) autocallStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
autocallStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)
(自 6.4) autocallStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)
(自 6.4) autocallStaticMethod(const char *className, const char *methodName, Args &&... args)
(自 6.4) autocallStaticMethod(jclass clazz, const char *methodName, Args &&... args)
(since 6.7) 自动callStaticMethod(const char *methodName, Args &&... args)
QJniObjectcallStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...)
QJniObjectcallStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...)
QJniObjectcallStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
(自 6.4) QJniObjectcallStaticObjectMethod(const char *className, const char *methodName, Args &&... args)
(自 6.4) QJniObjectcallStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)
(自 6.4) QJniObjectconstruct(Args &&... args)
QJniObjectfromLocalRef(jobject localRef)
QJniObjectfromString(const QString &string)
autogetStaticField(const char *className, const char *fieldName)
autogetStaticField(jclass clazz, const char *fieldName)
autogetStaticField(const char *fieldName)
QJniObjectgetStaticObjectField(const char *className, const char *fieldName)
QJniObjectgetStaticObjectField(const char *className, const char *fieldName, const char *signature)
QJniObjectgetStaticObjectField(jclass clazz, const char *fieldName)
QJniObjectgetStaticObjectField(jclass clazz, const char *fieldName, const char *signature)
boolisClassAvailable(const char *className)
voidsetStaticField(const char *className, const char *fieldName, T value)
voidsetStaticField(const char *className, const char *fieldName, const char *signature, T value)
voidsetStaticField(jclass clazz, const char *fieldName, const char *signature, T value)
voidsetStaticField(jclass clazz, const char *fieldName, T value)
voidsetStaticField(const char *fieldName, T value)
booloperator!=(const QJniObject &o1, const QJniObject &o2)
booloperator==(const QJniObject &o1, const QJniObject &o2)

详细描述

QJniObject类包装了一个Java对象的引用,确保它不会被垃圾回收,并提供对大多数JNIEnv方法调用(成员、静态)和字段(设置器、获取器)的访问。它消除了通常需要的很多模板代码,在进行每个操作时,包括异常处理,都可以直接访问JNI。

注意:此API是为了与Android一起使用而设计和测试的。它尚未在其他平台上进行测试。

一般注意事项

  • 类名需要完全限定,例如:"java/lang/String"
  • 方法签名写成“(参数类型)返回类型”的形式,请参阅JNI 类型
  • 所有对象类型都以 QJniObject 形式返回。

方法签名

QJniObject 提供了便利函数,这些函数将根据提供的模板类型使用正确的签名。对于只返回和接受JNI 类型的函数,签名可以在编译时生成

jint x = QJniObject::callMethod<jint>("getSize");
QJniObject::callMethod<void>("touch");
jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());

这些函数是可变模板,编译器将根据实际参数类型推导模板参数。在许多情况下,只需要明确提供返回类型。

对于接受其他参数类型的函数,您需要自己提供签名。确保签名与您要调用的函数匹配很重要。下面的示例演示了如何调用不同的静态函数

// Java class
package org.qtproject.qt;
class TestClass
{
    static TestClass create() { ... }
    static String fromNumber(int x) { ... }
    static String[] stringArray(String s1, String s2) { ... }
}

签名结构为“(参数类型)返回类型”。签名中的数组类型必须具有“[”前缀,而完全合格的“Object”类型名称必须具有“L”前缀和“;”后缀。create 函数的签名是“()Lorg/qtproject/qt/TestClass;”。第二个和第三个函数的签名分别是“(I)Ljava/lang/String;”和“(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;”。

我们可以这样调用 create() 函数

// C++ code
QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
                                                          "create",
                                                          "()Lorg/qtproject/qt/TestClass;");

对于第二个和第三个函数,我们可以依赖 QJniObject 的模板方法来创建隐式签名字符串,但也可以显式传递签名字符串

// C++ code
QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
                                                             "fromNumber",
                                                             "(I)Ljava/lang/String;", 10);

为了使隐式签名创建生效,我们需要明确指定返回类型

// C++ code
QJniObject string1 = QJniObject::fromString("String1");
QJniObject string2 = QJniObject::fromString("String2");
QJniObject stringArray = QJniObject::callStaticObjectMethod<jobjectArray>(
                                                            "org/qtproject/qt/TestClass",
                                                            "stringArray",
                                                            string1.object<jstring>(),
                                                            string2.object<jstring>());

请注意,虽然第一个模板参数指定了 Java 函数的返回类型,但方法仍然会返回一个 QJniObject。

处理 Java 异常

在调用可能抛出异常的 Java 函数后,检查、处理并清除任何异常是非常重要的。所有 QJniObject 函数都通过报告和清除异常内部处理异常,从而省去了客户端代码处理异常的需要。

注意:当直接使用 JNIEnv 进行 JNI 调用时,用户必须手动处理异常。当有异常等待时执行其他 JNI 调用是不安全的。有关更多信息,请参阅QJniEnvironment::checkAndClearExceptions

Java 本地方法

Java 本地方法使得从 Java 调用本地代码成为可能,这是通过在 Java 中创建一个带有 native 关键字的功能声明来实现的。在 Java 中可以调用本地函数之前,您需要将 Java 本地函数映射到您代码中的本地函数。可以通过调用QJniEnvironment::registerNativeMethods来执行映射函数。

以下示例演示了如何进行操作。

Java 实现方式

class FooJavaClass
{
    public static void foo(int x)
    {
        if (x < 100)
            callNativeOne(x);
        else
            callNativeTwo(x);
    }

private static native void callNativeOne(int x);
private static native void callNativeTwo(int x);

}

C++ 实现方式

static void fromJavaOne(JNIEnv *env, jobject thiz, jint x)
{
    Q_UNUSED(env);
    Q_UNUSED(thiz);
    qDebug() << x << "< 100";
}

static void fromJavaTwo(JNIEnv *env, jobject thiz, jint x)
{
    Q_UNUSED(env);
    Q_UNUSED(thiz);
    qDebug() << x << ">= 100";
}

void foo()
{
    // register the native methods first, ideally it better be done with the app start
    const JNINativeMethod methods[] =
                {{"callNativeOne", "(I)V", reinterpret_cast<void *>(fromJavaOne)},
                 {"callNativeTwo", "(I)V", reinterpret_cast<void *>(fromJavaTwo)}};
    QJniEnvironment env;
    env.registerNativeMethods("my/java/project/FooJavaClass", methods, 2);

    // Call the java method which will calls back to the C++ functions
    QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10);  // Output: 10 < 100
    QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Output: 100 >= 100
}

Java 对象的生命周期

从Java接收的大多数对象将是局部引用,并仅在你从本地方法返回时有效。之后,该对象将可回收。如果你的代码在循环中创建很多局部引用,你应该在每次迭代中手动删除它们,否则你可能会耗尽内存。更多信息,请参阅JNI设计概述:全局和局部引用。在本地方法作用域外创建的局部引用必须手动删除,因为垃圾收集器不会自动释放它们,因为我们使用了AttachCurrentThread。更多信息,请参阅JNI技巧:局部和全局引用

如果你想保持一个Java对象存活,你需要创建一个新的指向此对象的全球引用,并在你完成时释放它,或者构造一个新QJniObject并让它管理Java对象的生命周期。

注意: QJniObject只管理其自己的引用,如果你从一个全局或局部引用中构造QJniObject,QJniObject不会释放该引用。

JNI类型

对象类型

类型签名
jobjectLjava/lang/Object;
jclassLjava/lang/Class;
jstringLjava/lang/String;
jthrowableLjava/lang/Throwable;
jobjectArray[Ljava/lang/Object;
jarray[<type>
jbooleanArray[Z
jbyteArray[B
jcharArray[C
jshortArray[S
jintArray[I
jlongArray[J
jfloatArray[F
jdoubleArray[D

原始类型

类型签名
jbooleanZ
jbyteB
jcharC
jshortS
jintI
jlongJ
jfloatF
jdoubleD

其他

类型签名
voidV
自定义类型L<fully-qualified-name>;

有关JNI的更多信息,请参阅Java Native Interface规范

另请参阅 QJniEnvironment对象

成员函数文档

模板 <typename T> T QJniObject::object() const

jobject QJniObject::object() const

返回由 QJniObject 持有的对象,要么作为 jobject,要么作为类型 T。T 可以是JNI 对象类型之一。

QJniObject string = QJniObject::fromString("Hello, JNI");
jstring jstring = string.object<jstring>();

注意: 返回的对象仍然由这个 QJniObject 维护。为了使对象在 QJniObject 的生命周期之外保持活跃,例如记录以备后用,最简单的方法是将它存储在另一个具有适当生命周期的 QJniObject 中。或者,你可以创建一个指向对象的新全局引用并将其存储,确保在使用完毕后释放它。

void functionScope()
{
    QString helloString("Hello");
    jstring myJString = 0;
    {
        QJniObject string = QJniObject::fromString(helloString);
        myJString = string.object<jstring>();
    }

   // Ops! myJString is no longer valid.
}

QJniObject::QJniObject()

构建一个无效的JNI对象。

另请参阅 isValid

[显式] QJniObject::QJniObject(const char *className)

通过调用 className 的默认构造函数来创建一个新的JNI对象。

QJniObject myJavaString("java/lang/String");

[显式] QJniObject::QJniObject(const char *className, const char *signature, ...)

通过调用具有指定后续任何参数类型的签名 signature 的构造函数来创建一个新的JNI对象。

QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", "(Ljava/lang/String;)V", myJStringArg);

[显式,自6.4起] 模板 <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)

通过调用构造函数来创建一个新的JNI对象,该构造函数使用参数 args。此构造函数仅在所有 args 都已知的情况下可用。

QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", myJStringArg);

此函数是在Qt 6.4中引入的。

[显式] QJniObject::QJniObject(jclass clazz)

通过调用 clazz 的默认构造函数来创建一个新的JNI对象。

注意: QJniObject 将创建一个新的 clazz 类引用,并在销毁时释放它。在 QJniObject 之外创建的类引用需要由调用者管理。

[显式] QJniObject::QJniObject(jclass clazz, const char *signature, ...)

通过调用具有指定后续任何参数类型的签名 signature 的构造函数来从 clazz 创建一个新的JNI对象。

QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, "(I)V", 3);

[显式,自6.4起] 模板 <typename... Args> QJniObject::QJniObject(jclass clazz, Args &&... args)

通过调用具有参数 args 的构造函数来从 clazz 创建一个新的JNI对象。此构造函数仅在所有 args 都已知的情况下可用。

QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, 3);

此函数是在Qt 6.4中引入的。

QJniObject::QJniObject(jobject object)

围绕Java对象 object 创建一个新的JNI对象。

注意: QJniObject 将保持对Java对象 object 的引用,并在销毁时释放它。对 QJniObject 之外 Java 对象 object 的任何引用都需要由调用者管理。在大多数情况下,除非你打算自己管理局部引用,否则不应使用局部引用调用此函数。有关将局部引用转换为 QJniObject 的信息,请参阅 QJniObject::fromLocalRef()。

另请参阅:fromLocalRef().

[noexcept] QJniObject::~QJniObject()

销毁JNI对象并释放JNI对象持有的任何引用。

[自6.4起] 模板 <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const

使用指定后续任何参数类型的签名 signature 调用对象的 methodName 方法,并返回值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

QJniObject myJavaStrin("org/qtproject/qt/TestClass");
jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);

此函数是在Qt 6.4中引入的。

[自6.4起] 模板 <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const

调用带参数 args 的方法 methodName 并返回值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

QJniObject myJavaStrin("org/qtproject/qt/TestClass");
jint size = myJavaString.callMethod<jint>("length");

方法签名是在编译时从 Retargs 的类型推导出来的。

此函数是在Qt 6.4中引入的。

[自6.4起] 模板 <typename Ret, typename... Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&... args) const

调用 Java 对象的方法 methodName 并带参数 args,返回一个新的 QJniObject 来表示返回的 Java 对象。

QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");

方法签名是在编译时从 Retargs 的类型推导出来的。

此函数是在Qt 6.4中引入的。

QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const

使用 signature 指定后续任何参数的类型,调用 Java 对象的方法 methodName

QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject mySubstring = myJavaString.callObjectMethod("substring",
                                                       "(II)Ljava/lang/String;", 7, 11);

[静态,自6.4起] 模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)

通过类 className 调用静态方法 methodName,使用 signature 指定后续任何参数的类型,返回方法的结果(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);

此函数是在Qt 6.4中引入的。

[静态] 模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)

使用 clazz 调用静态方法 methodName,并使用 signature 指定后续任何参数的类型,返回方法的结果(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>(javaMathClass, "max", "(II)I", a, b);

[静态,自6.4起] 模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)

调用指定为 methodId 的类 clazz 的静态方法以及任何后续参数,并返回类型为 Ret 的值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

clazzmethodId 已从前一个操作中缓存的时,这很有用。

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);
}

此函数是在Qt 6.4中引入的。

[static, since 6.4] 模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)

调用类 className 上的静态方法 methodName,使用参数 args,并返回类型为 Ret 的值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");

方法签名是在编译时从 Retargs 的类型推导出来的。

此函数是在Qt 6.4中引入的。

[static, since 6.4] 模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)

调用类 clazz 上的静态方法 methodName 并返回类型为 Ret 的值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");

方法签名是在编译时从 Retargs 的类型推导出来的。

此函数是在Qt 6.4中引入的。

[static, since 6.7] 模板 <typename Klass, typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)

调用类 Klass 上的静态方法 methodName 并返回类型为 Ret 的值(除非 Retvoid)。如果 Ret 是 jobject 类型,则返回值将是一个 QJniObject

该方法签名在编译时从 Ret 和参数 args 的类型推导得出。Klass 需要是一个具有注册类型映射到 Java 类型的 C++ 类型。

此函数在 Qt 6.7 中引入。

[static] QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...)

使用 signature 指定后续任何参数的类型,从类 className 调用静态方法 methodName

QJniObject thread = QJniObject::callStaticObjectMethod("java/lang/Thread", "currentThread",
                                                       "()Ljava/lang/Thread;");
QJniObject string = QJniObject::callStaticObjectMethod("java/lang/String", "valueOf",
                                                       "(I)Ljava/lang/String;", 10);

[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...)

使用 signature 指定后续任何参数的类型,从类 clazz 调用静态方法 methodName

[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)

从类 clazz 调用由 methodId 标识的静态方法以及随后的任何参数。当之前操作中已缓存 clazzmethodId 时,非常有用。

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);

[static, since 6.4] 模板 <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, Args &&... args)

调用类 className 上的静态方法 methodName,传递参数 args,并返回一个新的 QJniObject 用于返回的 Java 对象。

QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");

方法签名是在编译时从 Retargs 的类型推导出来的。

此函数是在Qt 6.4中引入的。

[静态,自 6.4 版起] 模板 <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)

clazz 上调用带有 methodName 的静态方法,传递参数 args,并返回一个新的 QJniObject 用于返回的 Java 对象。

此函数是在Qt 6.4中引入的。

[自 6.2 版起] QByteArray QJniObject::className() const

QByteArray 的形式返回 QJniObject 所持有的类对象的名称。

此功能是在 Qt 6.2 中引入的。

[静态,自 6.4 版起] 模板 <typename Class, typename... Args> QJniObject QJniObject::construct(Args &&... args)

构建与 Class 相等的 Java 类的实例并返回一个包含 JNI 对象的 QJniObject。传递给 args 的参数将传递给 Java 构造函数。

QJniObject javaString = QJniObject::construct<jstring>();

仅在所有 args 都是已知的 JNI 类型 时此函数可用。

此函数是在Qt 6.4中引入的。

[静态] QJniObject QJniObject::fromLocalRef(jobject localRef)

从一个本地 JNI 引用 localRef 创建一个 QJniObject。此函数在返回之前将占用 localRef 并释放它。

注意:仅用本地 JNI 引用调用此函数。例如,大多数通过 JNI 环境的原始 JNI 调用都返回指向 java 对象的局部引用。

jobject localRef = env->GetObjectArrayElement(array, index);
QJniObject element = QJniObject::fromLocalRef(localRef);

[静态] QJniObject QJniObject::fromString(const QString &string)

QString string 创建 Java 字符串并返回一个持有该字符串的 QJniObject

QString myQString = "QString";
QJniObject myJavaString = QJniObject::fromString(myQString);

另请参阅:toString()。

模板 <typename T> auto QJniObject::getField(const char *fieldName) const

检索字段的值。

QJniObject volumeControl("org/qtproject/qt/TestClass");
jint fieldValue = volumeControl.getField<jint>("FIELD_NAME");

模板 <typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const

从字段 fieldName 中检索 JNI 对象。

QJniObject field = jniObject.getObjectField<jstring>("FIELD_NAME");

QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const

使用 signature 从字段 fieldName 中检索 JNI 对象。

注意:此函数无需模板类型即可使用。

QJniObject field = jniObject.getObjectField("FIELD_NAME", "Ljava/lang/String;");

[静态] 模板 <typename T> auto QJniObject::getStaticField(const char *className, const char *fieldName)

从类 className 的静态字段 fieldName 中检索值。

[静态] 模板 <typename T> auto QJniObject::getStaticField (jclass clazz, const char *fieldName)

clazz 上的静态字段 fieldName 检索值。

[静态] 模板 <typename Klass, typename T> auto QJniObject::getStaticField (const char *fieldName)

从类 Klass 的静态字段 fieldName 中检索值。

Klass 需要是一个具有对 Java 类型进行映射的注册 C++ 类型。

[静态] 模板 <typename T> QJniObject::getStaticObjectField (const char *className, const char *fieldName)

从类 className 的字段 fieldName 检索对象。

QJniObject jobj = QJniObject::getStaticObjectField<jstring>("class/with/Fields", "FIELD_NAME");

[静态] QJniObject::getStaticObjectField (const char *className, const char *fieldName, const char *signature)

从类 className 的字段 fieldName 和签名 signature 中检索 JNI 对象。

注意:此函数无需模板类型即可使用。

QJniObject jobj = QJniObject::getStaticObjectField("class/with/Fields", "FIELD_NAME",
                                                   "Ljava/lang/String;");

[静态] 模板 <typename T> QJniObject::getStaticObjectField (jclass clazz, const char *fieldName)

clazz 的字段 fieldName 检索对象。

QJniObject jobj = QJniObject::getStaticObjectField<jstring>(clazz, "FIELD_NAME");

[静态] QJniObject::getStaticObjectField (jclass clazz, const char *fieldName, const char *signature)

从类 clazz 的字段 fieldName 和签名 signature 中检索 JNI 对象。

注意:此函数无需模板类型即可使用。

QJniObject jobj = QJniObject::getStaticObjectField(clazz, "FIELD_NAME", "Ljava/lang/String;");

[静态] bool QJniObject::isClassAvailable (const char *className)

如果 Java 类 className 可用,则返回 true。

if (QJniObject::isClassAvailable("java/lang/String")) {
    // condition statement
}

bool QJniObject::isValid () const

如果此实例持有有效的 Java 对象,则返回 true。

QJniObject qjniObject;                        // ==> isValid() == false
QJniObject qjniObject(0)                      // ==> isValid() == false
QJniObject qjniObject("could/not/find/Class") // ==> isValid() == false

[自 6.2 版起] jclass QJniObject::objectClass () const

jclass 形式返回 QJniObject 保持的类对象。

注意: 返回的对象仍然由这个 QJniObject 维护。为了使对象在 QJniObject 的生命周期之外保持活跃,例如记录以备后用,最简单的方法是将它存储在另一个具有适当生命周期的 QJniObject 中。或者,你可以创建一个指向对象的新全局引用并将其存储,确保在使用完毕后释放它。

此功能是在 Qt 6.2 中引入的。

模板 <typename T> void QJniObject::setField (const char *fieldName, T value)

fieldName 的值设置为 value

QJniObject obj;
obj.setField<jint>("AN_INT_FIELD", 10);
jstring myString = ...;
obj.setField<jstring>("A_STRING_FIELD", myString);