QJniObject 类
Java Native Interface (JNI) 的便捷包装器。 更多信息...
头文件 | #include <QJniObject> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += 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) auto | callMethod(const char *methodName, const char *signature, Args &&... args) const |
(自 6.4) auto | callMethod(const char *methodName, Args &&... args) const |
(自 6.4) QJniObject | callObjectMethod(const char *methodName, Args &&... args) const |
QJniObject | callObjectMethod(const char *methodName, const char *signature, ...) const |
(自 6.2) QByteArray | className() const |
auto | getField(const char *fieldName) const |
QJniObject | getObjectField(const char *fieldName) const |
QJniObject | getObjectField(const char *fieldName, const char *signature) const |
bool | isValid() const |
jobject | object() const |
T | object() const |
(自 6.2) jclass | objectClass() const |
void | setField(const char *fieldName, T value) |
void | setField(const char *fieldName, const char *signature, T value) |
QString | toString() const |
QJniObject & | operator=(T object) |
静态公共成员
(自 6.4) auto | callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args) |
auto | callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args) |
(自 6.4) auto | callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args) |
(自 6.4) auto | callStaticMethod(const char *className, const char *methodName, Args &&... args) |
(自 6.4) auto | callStaticMethod(jclass clazz, const char *methodName, Args &&... args) |
(since 6.7) 自动 | callStaticMethod(const char *methodName, Args &&... args) |
QJniObject | callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...) |
QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...) |
QJniObject | callStaticObjectMethod(jclass clazz, jmethodID methodId, ...) |
(自 6.4) QJniObject | callStaticObjectMethod(const char *className, const char *methodName, Args &&... args) |
(自 6.4) QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args) |
(自 6.4) QJniObject | construct(Args &&... args) |
QJniObject | fromLocalRef(jobject localRef) |
QJniObject | fromString(const QString &string) |
auto | getStaticField(const char *className, const char *fieldName) |
auto | getStaticField(jclass clazz, const char *fieldName) |
auto | getStaticField(const char *fieldName) |
QJniObject | getStaticObjectField(const char *className, const char *fieldName) |
QJniObject | getStaticObjectField(const char *className, const char *fieldName, const char *signature) |
QJniObject | getStaticObjectField(jclass clazz, const char *fieldName) |
QJniObject | getStaticObjectField(jclass clazz, const char *fieldName, const char *signature) |
bool | isClassAvailable(const char *className) |
void | setStaticField(const char *className, const char *fieldName, T value) |
void | setStaticField(const char *className, const char *fieldName, const char *signature, T value) |
void | setStaticField(jclass clazz, const char *fieldName, const char *signature, T value) |
void | setStaticField(jclass clazz, const char *fieldName, T value) |
void | setStaticField(const char *fieldName, T value) |
相关非成员
bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
bool | operator==(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类型
对象类型
类型 | 签名 |
---|---|
jobject | Ljava/lang/Object; |
jclass | Ljava/lang/Class; |
jstring | Ljava/lang/String; |
jthrowable | Ljava/lang/Throwable; |
jobjectArray | [Ljava/lang/Object; |
jarray | [<type> |
jbooleanArray | [Z |
jbyteArray | [B |
jcharArray | [C |
jshortArray | [S |
jintArray | [I |
jlongArray | [J |
jfloatArray | [F |
jdoubleArray | [D |
原始类型
类型 | 签名 |
---|---|
jboolean | Z |
jbyte | B |
jchar | C |
jshort | S |
jint | I |
jlong | J |
jfloat | F |
jdouble | D |
其他
类型 | 签名 |
---|---|
void | V |
自定义类型 | L<fully-qualified-name>; |
有关JNI的更多信息,请参阅Java Native Interface规范。
另请参阅 QJniEnvironment 和 对象。
成员函数文档
返回由 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 方法,并返回值(除非 Ret
是 void
)。如果 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 并返回值(除非 Ret
是 void
)。如果 Ret
是 jobject 类型,则返回值将是一个 QJniObject。
QJniObject myJavaStrin("org/qtproject/qt/TestClass"); jint size = myJavaString.callMethod<jint>("length");
方法签名是在编译时从 Ret
和 args 的类型推导出来的。
此函数是在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");
方法签名是在编译时从 Ret
和 args 的类型推导出来的。
此函数是在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 指定后续任何参数的类型,返回方法的结果(除非 Ret
是 void
)。如果 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 指定后续任何参数的类型,返回方法的结果(除非 Ret
是 void
)。如果 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
的值(除非 Ret
是 void
)。如果 Ret
是 jobject 类型,则返回值将是一个 QJniObject。
当 clazz 和 methodId 已从前一个操作中缓存的时,这很有用。
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
的值(除非 Ret
是 void
)。如果 Ret
是 jobject 类型,则返回值将是一个 QJniObject。
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");
方法签名是在编译时从 Ret
和 args 的类型推导出来的。
此函数是在Qt 6.4中引入的。
[static, since 6.4]
模板 <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)
调用类 clazz 上的静态方法 methodName 并返回类型为 Ret
的值(除非 Ret
是 void
)。如果 Ret
是 jobject 类型,则返回值将是一个 QJniObject。
QJniEnvironment env; jclass javaMathClass = env.findClass("java/lang/Math"); jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");
方法签名是在编译时从 Ret
和 args 的类型推导出来的。
此函数是在Qt 6.4中引入的。
[static, since 6.7]
模板 <typename Klass, typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
调用类 Klass
上的静态方法 methodName 并返回类型为 Ret
的值(除非 Ret
是 void
)。如果 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 标识的静态方法以及随后的任何参数。当之前操作中已缓存 clazz 和 methodId 时,非常有用。
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");
方法签名是在编译时从 Ret
和 args 的类型推导出来的。
此函数是在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);
> void QJniObject::setField(const char *fieldName, const char *signature, T value)(a class="plink" href="#setField-1" title="直接链接到此标题">
设置fieldName的值,使用signature为value。
QJniObject stringArray = ...; QJniObject obj = ...; obj.setObjectField<jobjectArray>("KEY_VALUES", "([Ljava/lang/String;)V", stringArray.object<jobjectArray>())
[static]
> void QJniObject::setStaticField(const char *className, const char *fieldName, T value)(a class="plink" href="#setStaticField" title="直接链接到此标题">
将类className的静态字段fieldName设置为value。
[static]
> void QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, T value)(a class="plink" href="#setStaticField-1" title="直接链接到此标题">
使用具有signature的setter将类className的静态字段fieldName设置为value。
[static]
> void QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, T value)(a class="plink" href="#setStaticField-2" title="直接链接到此标题">
使用具有signature的setter将类clazz的静态字段fieldName设置为value。
[static]
> void QJniObject::setStaticField(jclass clazz, const char *fieldName, T value)(a class="plink" href="#setStaticField-3" title="直接链接到此标题">
将类clazz的静态字段fieldName设置为value。
[static]
> void QJniObject::setStaticField(const char *fieldName, T value)(a class="plink" href="#setStaticField-4" title="直接链接到此标题">
将类Klass
的静态字段fieldName设置为value。
Klass
需要是一个具有对 Java 类型进行映射的注册 C++ 类型。
QString QJniObject::toString() const(a class="plink" href="#toString" title="直接链接到此标题">
返回一个具有Java对象的字符串表示的QString。在Java String对象上调用此函数是获取实际字符串数据的一种方便方式。
QJniObject string = ...; // "Hello Java" QString qstring = string.toString(); // "Hello Java"
另请参阅fromString().
, bool > = true>> QJniObject &QJniObject::operator=(T object)(a class="plink" href="#operator-eq-2" title="直接链接到此标题">
用object替换当前对象。旧Java对象将被释放。
相关非成员
bool operator!=(const QJniObject &o1, const QJniObject &o2)(a class="plink" href="#operator-not-eq-1" title="直接链接到此标题">
如果o1持有与o2不同对象的引用,则返回true。
bool operator==(const QJniObject &o1, const QJniObject &o2)
如果两个对象o1和o2引用了相同的Java对象,或两个都是NULL,则返回true。在其他任何情况下将返回false。
© 2024 Qt公司有限公司。此处包含的文档贡献版权属于各自的所有者。本提供的文档根据自由软件基金会发布的GNU自由文档许可证1.3版本的条款进行许可。Qt及其相关标志是芬兰及/或其他国家的Qt公司在世界范围内的商标。所有其他商标均为各自所有者的财产。