QJniObject Class
Eine praktische Hülle für die Java Native Interface (JNI). Mehr...
| Überschrift: | #include <QJniObject> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Seit: | Qt 6.1 |
Öffentliche Funktionen
| QJniObject() | |
| QJniObject(const char *className) | |
| QJniObject(jclass clazz) | |
| QJniObject(jobject object) | |
(since 6.4) | QJniObject(const char *className, Args &&... args) |
(since 6.4) | QJniObject(jclass clazz, Args &&... args) |
| QJniObject(const char *className, const char *signature, ...) | |
| QJniObject(jclass clazz, const char *signature, ...) | |
| QJniObject(const QJniObject &other) | |
| QJniObject(QJniObject &&other) | |
| ~QJniObject() | |
(since 6.4) auto | callMethod(const char *methodName, Args &&... args) const |
(since 6.4) auto | callMethod(const char *methodName, const char *signature, Args &&... args) const |
(since 6.4) QJniObject | callObjectMethod(const char *methodName, Args &&... args) const |
| QJniObject | callObjectMethod(const char *methodName, const char *signature, ...) const |
(since 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 |
(since 6.2) jclass | objectClass() const |
| auto | setField(const char *fieldName, Type value) |
| auto | setField(const char *fieldName, const char *signature, Type value) |
(since 6.8) void | swap(QJniObject &other) |
| QString | toString() const |
| QJniObject & | operator=(QJniObject &&other) |
| QJniObject & | operator=(T object) |
| QJniObject & | operator=(const QJniObject &other) |
Statische öffentliche Mitglieder
(since 6.7) auto | callStaticMethod(const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args) |
(since 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) |
(since 6.4) QJniObject | callStaticObjectMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args) |
| QJniObject | callStaticObjectMethod(jclass clazz, jmethodID methodId, ...) |
| QJniObject | callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...) |
| QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...) |
(since 6.4) auto | construct(Args &&... args) |
| QJniObject | fromLocalRef(jobject localRef) |
| QJniObject | fromString(const QString &string) |
| auto | getStaticField(const char *fieldName) |
| auto | getStaticField(const char *className, const char *fieldName) |
| auto | getStaticField(jclass clazz, const char *fieldName) |
| QJniObject | getStaticObjectField(const char *className, const char *fieldName) |
| QJniObject | getStaticObjectField(jclass clazz, const char *fieldName) |
| QJniObject | getStaticObjectField(const char *className, const char *fieldName, const char *signature) |
| QJniObject | getStaticObjectField(jclass clazz, const char *fieldName, const char *signature) |
| bool | isClassAvailable(const char *className) |
| auto | setStaticField(const char *fieldName, Type value) |
| auto | setStaticField(const char *className, const char *fieldName, Type value) |
| auto | setStaticField(jclass clazz, const char *fieldName, Type value) |
| auto | setStaticField(const char *className, const char *fieldName, const char *signature, Type value) |
| auto | setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value) |
Verwandte Nicht-Mitglieder
| bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
| bool | operator==(const QJniObject &o1, const QJniObject &o2) |
Ausführliche Beschreibung
Die Klasse `QJniObject` verpackt eine Referenz auf ein Java-Objekt, stellt sicher, dass dieses nicht von der Garbage Collection entfernt wird, und bietet Zugriff auf die meisten JNIEnv Methodenaufrufe (Member, statisch) und Felder (Setter, Getter). Sie erspart viel Routine-Code, der normalerweise bei direktem JNI-Zugriff für jede Operation erforderlich wäre. Von aufgerufenen Java-Methoden ausgelöste Ausnahmen werden standardmäßig abgefangen, können aber seit Qt 6.11 auch vom Aufrufer behandelt werden.
Hinweis: Diese API wurde für die Verwendung mit Android entwickelt und getestet. Sie wurde nicht für andere Plattformen getestet.
Methodensignaturen
QJniObject bietet Komfortfunktionen, die anhand der angegebenen oder abgeleiteten Template-Argumente die richtige Signatur verwenden.
jint x = QJniObject::callMethod<jint>("getSize");
QJniObject::callMethod<void>("touch");
jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());Diese Funktionen sind variadische Vorlagen, und der Compiler leitet die Signatur aus den tatsächlichen Argumenttypen ab. Lediglich der Rückgabetyp muss explizit angegeben werden. QJniObject kann die Signaturzeichenfolge für Funktionen ableiten, die „ JNI types “ als Argument verwenden, sowie für Typen, die mit der Typzuordnung „ QtJniTypes “ deklariert wurden.
// Java class
package org.qtproject.qt;
class TestClass
{
static TestClass create() { ... }
static String fromNumber(int x) { ... }
static String[] stringArray(String s1, String s2) { ... }
}// C++ code
Q_DECLARE_JNI_CLASS(TestClass, "org/qtproject/qt/TestClass")
// ...
using namespace QtJniTypes;
TestClass testClass = TestClass::callStaticMethod<TestClass>("create");Dies ermöglicht die Arbeit mit beliebigen Java- und Android-Typen im C++-Code, ohne dass JNI-Signaturzeichenfolgen explizit erstellt werden müssen.
Explizite JNI-Signaturen
Es ist möglich, die Signatur selbst anzugeben. In diesem Fall ist es wichtig, dass die Signatur mit der Funktion übereinstimmt, die Sie aufrufen möchten.
- Klassennamen müssen vollqualifiziert sein, zum Beispiel:
"java/lang/String". - Methodensignaturen werden wie folgt geschrieben:
"(ArgumentsTypes)ReturnType", siehe JNI Types. - Alle Objekttypen werden als `QJniObject` zurückgegeben.
Das folgende Beispiel veranschaulicht, wie verschiedene statische Funktionen aufgerufen werden:
Die Signaturstruktur lautet „ "(ArgumentsTypes)ReturnType" “. Array-Typen in der Signatur müssen das Präfix „ [ “ tragen, und die vollqualifizierten Typnamen „ Object “ müssen das Präfix „ L “ sowie das Suffix „ ; “ enthalten. Die Signatur für die Funktion „ create “ lautet „ "()Lorg/qtproject/qt/TestClass; “. Die Signaturen für die zweite und dritte Funktion lauten „ "(I)Ljava/lang/String;" “ bzw. „ "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" “.
Wir können die Funktion „ create() “ wie folgt aufrufen:
// C++ code
QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
"create",
"()Lorg/qtproject/qt/TestClass;");Für die zweite und dritte Funktion können wir die Template-Methoden von `QJniObject` nutzen, um den impliziten Signaturstring zu erstellen, wir können den Signaturstring aber auch explizit übergeben:
// C++ code
QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
"fromNumber",
"(I)Ljava/lang/String;", 10);Damit die implizite Signaturerstellung funktioniert, müssen wir den Rückgabetyp explizit angeben:
// 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>());Beachten Sie, dass der erste Template-Parameter zwar den Rückgabetyp der Java-Funktion angibt, die Methode jedoch weiterhin ein `QJniObject` zurückgibt.
Behandlung von Java-Ausnahmen
Nach dem Aufruf von Java-Funktionen, die Ausnahmen auslösen könnten, ist es wichtig, vor der Fortsetzung zu prüfen, ob eine Ausnahme vorliegt, diese zu behandeln und zu beseitigen. Alle QJniObject-Funktionen können Ausnahmen intern verarbeiten, indem sie diese melden und zurücksetzen. Dazu gehören JNI-Ausnahmen, beispielsweise beim Versuch, eine nicht vorhandene Methode aufzurufen, oder bei falschen Parametern; außerdem werden Ausnahmen von der Methode ausgelöst, um Fehler zu melden oder Informationen über einen Fehlschlag zurückzugeben.
Ab Qt 6.11 kann Client-Code die Option wählen, Ausnahmen bei jedem Aufruf explizit zu behandeln. Verwenden Sie dazu „ std::expected “ aus C++ 23 als Rückgabetyp, den Werttyp als den erwarteten Typ und „ jthrowable “ als Fehlertyp. Wenn Sie beispielsweise versuchen, einen Einstellungswert über den Typ „ android.provider.Settings.Secure “ auszulesen, kann eine Ausnahme ausgelöst werden, falls die Einstellung nicht existiert.
Q_DECLARE_JNI_CLASS(SettingsSecure, "android/provider/Settings$Secure")
using namespace QtJniTypes;
QString enabledInputMethods()
{
ContentResolver resolver;
SettingsSecure settings;
auto defaultInputMethods = settings.callMethod<std::expected<QString, jthrowable>>(
"getString", resolver, u"enabled_input_methods"_s
);
if (defaultInputMethods)
return defaultInputMethods.value();
QStringList stackTrace = QJniEnvironment::stackTrace(defaultInputMethods.error());
}Sie können jeden anderen Typ verwenden, der sich wie ` std::expected` verhält, sodass eine explizite Ausnahmebehandlung auch ohne C++23 möglich ist. Die einzigen Voraussetzungen sind, dass der Typ drei verschachtelte Typen ` value_type`, ` error_type` und ` unexpected_type` deklariert, aus dem Werttyp konstruiert werden kann und über eine ` unexpected_type ` verfügt, die einen ` jthrowable` enthält.
Hinweis: Bei JNI-Aufrufen, die direkt über ` JNIEnv ` erfolgen, mussder Benutzer Ausnahmen manuell behandeln. Es ist unsicher, andere JNI-Aufrufe auszuführen, solange Ausnahmen anhängig sind. Weitere Informationen finden Sie unter ` QJniEnvironment::checkAndClearExceptions()`.
Java Native Methods
Java-Native-Methoden ermöglichen den Aufruf von nativem Code aus Java heraus. Dazu wird in Java eine Funktionsdeklaration erstellt, der das Schlüsselwort „ native “ vorangestellt wird. Bevor eine native Funktion aus Java aufgerufen werden kann, müssen Sie die Java-Native-Funktion einer nativen Funktion in Ihrem Code zuordnen. Die Zuordnung von Funktionen erfolgt durch den Aufruf von „ QJniEnvironment::registerNativeMethods()“.
Das folgende Beispiel veranschaulicht, wie dies umgesetzt werden kann.
Java-Implementierung:
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++-Implementierung:
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()
{
// Zuerst die nativen Methoden registrieren; idealerweise sollte dies beim Start der App erfolgen
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);
// Die Java-Methode aufrufen, die wiederum die C++-Funktionen aufruft
QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10); // Ausgabe: 10 < 100
QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Ausgabe: 100 >= 100
}Die Lebensdauer eines Java-Objekts
Die meisten von Java empfangenen „ objects “ sind lokale Referenzen und bleiben nur so lange gültig, bis Sie aus der nativen Methode zurückkehren. Danach kann das Objekt von der Garbage Collection entfernt werden. Wenn Ihr Code in einer Schleife viele lokale Referenzen erstellt, sollten Sie diese bei jeder Iteration manuell löschen, da Ihnen sonst möglicherweise der Speicher ausgeht. Weitere Informationen finden Sie unter „JNI-Designübersicht: Globale und lokale Referenzen“. Lokale Referenzen, die außerhalb des Gültigkeitsbereichs einer nativen Methode erstellt wurden, müssen manuell gelöscht werden, da der Garbage Collector sie nicht automatisch freigibt, da wir „AttachCurrentThread“ verwenden. Weitere Informationen finden Sie unter „JNI-Tipps: Lokale und globale Referenzen“.
Wenn Sie ein Java-Objekt am Leben erhalten möchten, müssen Sie entweder eine neue globale Referenz auf das Objekt erstellen und diese freigeben, sobald Sie fertig sind, oder ein neues `QJniObject` anlegen und die Lebensdauer des Java-Objekts von diesem verwalten lassen.
Hinweis: Das ` QJniObject` verwaltet nur seine eigenen Referenzen. Wenn Sie ein `QJniObject` aus einer globalen oder lokalen Referenz erstellen, wird diese Referenz vom `QJniObject` nicht freigegeben.
JNI-Typen
Objekttypen
| Typ | Signatur |
|---|---|
| jobject | Ljava/lang/Object; |
| jclass | Ljava/lang/Class; |
| jstring | Ljava/lang/String; |
| jthrowable | Ljava/lang/Throwable; |
| jobjectArray | [Ljava/lang/Object; |
| jarray | [<Typ> |
| jbooleanArray | [Z |
| jbyteArray | [B |
| jcharArray | [C |
| jshortArray | [S |
| jintArray | [I |
| jlongArray | [J |
| jfloatArray | [F |
| jdoubleArray | [D |
Primitive Typen
| Typ | Signatur |
|---|---|
| jboolean | Z |
| jbyte | B |
| jchar | C |
| jshort | S |
| jint | I |
| jlong | J |
| jfloat | F |
| jdouble | D |
Sonstiges
| Typ | Signatur |
|---|---|
| void | V |
| Benutzerdefinierter Typ | L<vollständig-qualifizierter-Name>; |
Weitere Informationen zu JNI finden Sie in der Java Native Interface-Spezifikation.
Siehe auch QJniEnvironment und object().
Dokumentation zu den Mitgliedsfunktionen
QJniObject::QJniObject()
Erstellt ein ungültiges JNI-Objekt.
Siehe auch ` isValid()`.
[explicit] QJniObject::QJniObject(const char *className)
Erstellt ein neues JNI-Objekt, indem der Standardkonstruktor von ` className` aufgerufen wird.
QJniObject myJavaString("java/lang/String");[explicit] QJniObject::QJniObject(jclass clazz)
Erstellt ein neues JNI-Objekt durch Aufruf des Standardkonstruktors von ` clazz`.
Hinweis: Das `QJniObject` erstellt eine neue Referenz auf die Klasse ` clazz ` und gibt diese bei seiner Zerstörung wieder frei. Referenzen auf die Klasse, die außerhalb des `QJniObject` erstellt wurden, müssen vom Aufrufer verwaltet werden.
QJniObject::QJniObject(jobject object)
Erstellt ein neues JNI-Objekt, das das Java-Objekt „ object “ umschließt.
Hinweis: Das QJniObject hält eine Referenz auf das Java-Objekt „ object “ und gibt diese bei seiner Zerstörung frei. Alle Referenzen auf das Java-Objekt „ object “ außerhalb von QJniObject müssen vom Aufrufer verwaltet werden. In den meisten Fällen sollten Sie diese Funktion niemals mit einer lokalen Referenz aufrufen, es sei denn, Sie beabsichtigen, die lokale Referenz selbst zu verwalten. Informationen zum Konvertieren einer lokalen Referenz in ein `QJniObject` finden Sie unter ` QJniObject::fromLocalRef()`.
Siehe auch fromLocalRef().
[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)
Erstellt ein neues JNI-Objekt, indem der Konstruktor von ` className ` mit den Argumenten ` args` aufgerufen wird. Dieser Konstruktor ist nur verfügbar, wenn alle ` args ` bekannt sind JNI Types.
QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", myJStringArg);Diese Funktion wurde in Qt 6.4 eingeführt.
[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(jclass clazz, Args &&... args)
Erstellt ein neues JNI-Objekt aus „ clazz “, indem der Konstruktor mit den Argumenten „ args “ aufgerufen wird. Dieser Konstruktor ist nur verfügbar, wenn alle „ args “ bekannt sind: „ JNI Types “.
QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, 3);Diese Funktion wurde in Qt 6.4 eingeführt.
[explicit] QJniObject::QJniObject(const char *className, const char *signature, ...)
Erstellt ein neues JNI-Objekt, indem der Konstruktor von ` className ` aufgerufen wird, wobei ` signature ` die Typen aller nachfolgenden Argumente angibt.
QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", "(Ljava/lang/String;)V", myJStringArg);[explicit] QJniObject::QJniObject(jclass clazz, const char *signature, ...)
Erstellt ein neues JNI-Objekt aus ` clazz `, indem der Konstruktor mit ` signature ` aufgerufen wird, wobei die Typen aller nachfolgenden Argumente angegeben werden.
QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, "(I)V", 3);[noexcept default] QJniObject::QJniObject(const QJniObject &other)
Erstellt eine Kopie einer Instanz von ` QJniObject`.
[noexcept default] QJniObject::QJniObject(QJniObject &&other)
Erstellt eine Instanz von ` QJniObject` mithilfe von `move`.
[noexcept] QJniObject::~QJniObject()
Löscht das JNI-Objekt und gibt alle vom JNI-Objekt gehaltenen Verweise frei.
[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const
Ruft die Methode „ methodName “ mit den Argumenten „ args “ auf und gibt den Wert zurück (es sei denn, „Ret“ ist vom Typ „ void “). Ist „Ret“ vom Typ „jobject“, so ist der zurückgegebene Wert ein „ QJniObject “.
QJniObject myJavaString("org/qtproject/qt/TestClass");
jint size = myJavaString.callMethod<jint>("length");Die Methodensignatur wird zur Kompilierungszeit aus `Ret` und den Typen von ` args` abgeleitet. `Ret` kann ein mit ` std::expected` kompatibler Typ sein, der einen Wert zurückgibt, oder ` any Java exception thrown ` durch die aufgerufene Methode.
Diese Funktion wurde in Qt 6.4 eingeführt.
[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const
Ruft die Methode „ methodName “ des Objekts auf, wobei „ signature “ die Typen aller nachfolgenden Argumente „ args “ angibt, und gibt den Wert zurück (es sei denn, „Ret“ ist „ void “). Ist „Ret“ vom Typ „jobject“, so ist der zurückgegebene Wert ein „ QJniObject “.
QJniObject myJavaString("org/qtproject/qt/TestClass");
jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);Diese Funktion wurde in Qt 6.4 eingeführt.
[since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&... args) const
Ruft die Methode „ methodName “ des Java-Objekts mit den Argumenten „ args “ auf und gibt ein neues „ QJniObject “ für das zurückgegebene Java-Objekt zurück.
QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");Die Methodensignatur wird zur Kompilierungszeit aus `Ret` und den Typen von ` args` abgeleitet. `Ret` kann ein mit ` std::expected` kompatibler Typ sein, der einen Wert zurückgibt, oder ` any Java exception thrown ` durch die aufgerufene Methode.
Diese Funktion wurde in Qt 6.4 eingeführt.
QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const
Ruft die Methode „ methodName “ des Java-Objekts auf, wobei „ signature “ die Typen aller nachfolgenden Argumente angibt.
QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject mySubstring = myJavaString.callObjectMethod("substring",
"(II)Ljava/lang/String;", 7, 11);[static, since 6.7] template <
typename Klass,
typename ReturnType = void,
typename... Args
>
auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
Ruft die statische Methode „ methodName “ der Klasse „ Klass “ auf und gibt den Wert vom Typ „Ret“ zurück (es sei denn, „Ret“ ist vom Typ „ void “). Ist „Ret“ ein „jobject“-Typ, ist der zurückgegebene Wert ein „ QJniObject “.
Die Methodensignatur wird zur Kompilierungszeit aus „Ret“ und den Typen von „ args “ abgeleitet. „ Klass “ muss ein C++-Typ sein, für den eine Typzuordnung zu einem Java-Typ registriert ist. „Ret“ kann ein mit „ std::expected “ kompatibler Typ sein, der einen Wert zurückgibt, oder ein „ any Java exception thrown “, der von der aufgerufenen Methode zurückgegeben wird.
Diese Funktion wurde in Qt 6.7 eingeführt.
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)
Ruft die statische Methode ` methodName ` der Klasse ` className ` mit den Argumenten ` args` auf und gibt den Wert vom Typ `Ret` zurück (es sei denn, `Ret` ist ` void`). Ist `Ret` ein `jobject`-Typ, so ist der zurückgegebene Wert ein ` QJniObject`.
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");Die Methodensignatur wird zur Kompilierungszeit aus `Ret` und den Typen von ` args` abgeleitet. `Ret` kann ein mit ` std::expected` kompatibler Typ sein, der einen Wert zurückgibt, oder ` any Java exception thrown ` durch die aufgerufene Methode.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)
Ruft die statische Methode „ methodName “ auf „ clazz “ auf und gibt den Wert vom Typ „Ret“ zurück (es sei denn, „Ret“ ist „ void “). Ist „Ret“ ein „jobject“-Typ, so ist der zurückgegebene Wert ein „ QJniObject “.
QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");Die Methodensignatur wird zur Kompilierungszeit aus „Ret“ und den Typen von „ args “ abgeleitet. „Ret“ kann ein mit „ std::expected “ kompatibler Typ sein, der einen Wert zurückgibt, oder „ any Java exception thrown “ durch die aufgerufene Methode.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)
Ruft die durch methodId identifizierte statische Methode aus der Klasse clazz mit allen nachfolgenden Argumenten auf und gibt den Wert vom Typ Ret zurück (es sei denn, Ret ist vom Typ void). Ist Ret ein jobject-Typ, so ist der zurückgegebene Wert ein QJniObject.
Dies ist nützlich, wenn ` clazz ` und ` methodId ` bereits aus früheren Operationen zwischengespeichert sind.
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);
}Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
Ruft die statische Methode „ methodName “ aus der Klasse „ className “ auf, wobei „ signature “ die Typen aller nachfolgenden Argumente angibt: „ args “. Gibt das Ergebnis der Methode zurück (es sei denn, „Ret“ ist „ void “). Ist „Ret“ ein „jobject“-Typ, so ist der zurückgegebene Wert ein „ QJniObject “.
jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);Diese Funktion wurde in Qt 6.4 eingeführt.
[static] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)
Ruft die statische Methode „ methodName “ aus „ clazz “ mit „ signature “ auf, wobei die Typen aller nachfolgenden Argumente angegeben werden. Gibt das Ergebnis der Methode zurück (es sei denn, „Ret“ ist vom Typ „ void “). Ist „Ret“ vom Typ „jobject“, so ist der zurückgegebene Wert ein „ 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);[static, since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, Args &&... args)
Ruft die statische Methode mit ` methodName ` der Klasse ` className` auf, übergibt die Argumente ` args` und gibt ein neues ` QJniObject ` für das zurückgegebene Java-Objekt zurück.
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");Die Methodensignatur wird zur Kompilierungszeit aus `Ret` und den Typen von ` args` abgeleitet. `Ret` kann ein mit ` std::expected` kompatibler Typ sein, der einen Wert zurückgibt, oder ` any Java exception thrown ` durch die aufgerufene Methode.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)
Ruft die statische Methode mit „ methodName “ auf „ clazz “ auf, übergibt dabei die Argumente „ args “ und gibt ein neues „ QJniObject “ für das zurückgegebene Java-Objekt zurück.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
Ruft die durch „ methodId “ bezeichnete statische Methode aus der Klasse „ clazz “ mit den nachfolgenden Argumenten auf. Dies ist nützlich, wenn „ clazz “ und „ methodId “ bereits aus früheren Vorgängen zwischengespeichert sind.
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] QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...)
Ruft die statische Methode ` methodName ` aus der Klasse ` className ` auf, wobei ` signature ` die Typen aller nachfolgenden Argumente angibt.
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, ...)
Ruft die statische Methode „ methodName “ aus der Klasse „ clazz “ auf, wobei „ signature “ die Typen aller nachfolgenden Argumente angibt.
[since 6.2] QByteArray QJniObject::className() const
Gibt den Namen des Klassenobjekts zurück, das von der ` QJniObject ` als ` QByteArray` gehalten wird.
Diese Funktion wurde in Qt 6.2 eingeführt.
[static, since 6.4] template <typename Class, typename... Args> auto QJniObject::construct(Args &&... args)
Erstellt eine Instanz der Java-Klasse, die dem „ Class “ entspricht, und gibt ein „ QJniObject “ zurück, das das JNI-Objekt enthält. Die Argumente in „ args “ werden an den Java-Konstruktor übergeben.
QJniObject javaString = QJniObject::construct<jstring>();Diese Funktion ist nur verfügbar, wenn alle „ args “ als „ JNI Types “ bekannt sind.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static] QJniObject QJniObject::fromLocalRef(jobject localRef)
Erstellt ein ` QJniObject ` aus der lokalen JNI-Referenz ` localRef`. Diese Funktion übernimmt die Verantwortung für ` localRef ` und gibt es vor der Rückgabe frei.
Hinweis: Rufen Sie diese Funktionnur mit einer lokalen JNI-Referenz auf. Beispielsweise geben die meisten „Raw“-JNI-Aufrufe über die JNI-Umgebung lokale Referenzen auf ein Java-Objekt zurück.
jobject localRef = env->GetObjectArrayElement(array, index);
QJniObject element = QJniObject::fromLocalRef(localRef);[static] QJniObject QJniObject::fromString(const QString &string)
Erstellt eine Java-Zeichenkette aus dem ` QString ` ` string ` und gibt ein ` QJniObject ` zurück, das diese Zeichenkette enthält.
QString myQString = "QString";
QJniObject myJavaString = QJniObject::fromString(myQString);Siehe auch toString().
template <typename Type> auto QJniObject::getField(const char *fieldName) const
Ruft den Wert des Feldes „ fieldName “ ab.
QJniObject volumeControl("org/qtproject/qt/TestClass");
jint fieldValue = volumeControl.getField<jint>("FIELD_NAME");template <typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const
Ruft ein JNI-Objekt aus dem Feld „ fieldName “ ab.
QJniObject field = jniObject.getObjectField<jstring>("FIELD_NAME");QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const
Ruft ein JNI-Objekt aus dem Feld „ fieldName “ mit „ signature “ ab.
Hinweis: Diese Funktion kann ohne Vorlagentyp verwendet werden.
QJniObject field = jniObject.getObjectField("FIELD_NAME", "Ljava/lang/String;");[static] template <typename Klass, typename T> auto QJniObject::getStaticField(const char *fieldName)
Ruft den Wert aus dem statischen Feld „ fieldName “ der Klasse „ Klass “ ab.
Klass Es muss sich um einen C++-Typ handeln, für den eine Typzuordnung zu einem Java-Typ registriert ist.
[static] template <typename Type> auto QJniObject::getStaticField(const char *className, const char *fieldName)
Ruft den Wert aus dem statischen Feld „ fieldName “ der Klasse „ className “ ab.
[static] template <typename Type> auto QJniObject::getStaticField(jclass clazz, const char *fieldName)
Ruft den Wert aus dem statischen Feld „ fieldName “ unter clazz ab.
[static] template <typename T> QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)
Ruft das Objekt aus dem Feld „ fieldName “ der Klasse „ className “ ab.
QJniObject jobj = QJniObject::getStaticObjectField<jstring>("class/with/Fields", "FIELD_NAME");[static] template <typename T> QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)
Ruft das Objekt aus dem Feld „ fieldName “ unter clazz ab.
QJniObject jobj = QJniObject::getStaticObjectField<jstring>(clazz, "FIELD_NAME");[static] QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)
Ruft ein JNI-Objekt aus dem Feld „ fieldName “ mit dem Wert „ signature “ aus der Klasse „ className “ ab.
Hinweis: Diese Funktion kann ohne Template-Typ verwendet werden.
QJniObject jobj = QJniObject::getStaticObjectField("class/with/Fields", "FIELD_NAME",
"Ljava/lang/String;");[static] QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName, const char *signature)
Ruft ein JNI-Objekt aus dem Feld „ fieldName “ mit dem Wert „ signature “ aus der Klasse „ clazz “ ab.
Hinweis: Diese Funktion kann ohne Template-Typ verwendet werden.
QJniObject jobj = QJniObject::getStaticObjectField(clazz, "FIELD_NAME", "Ljava/lang/String;");[static] bool QJniObject::isClassAvailable(const char *className)
Gibt „true“ zurück, wenn die Java-Klasse „ className “ verfügbar ist.
if (QJniObject::isClassAvailable("java/lang/String")) {
// condition statement
}bool QJniObject::isValid() const
Gibt „true“ zurück, wenn diese Instanz ein gültiges Java-Objekt enthält.
QJniObject qjniObject; // ==> isValid() == false
QJniObject qjniObject(0) // ==> isValid() == false
QJniObject qjniObject("could/not/find/Class") // ==> isValid() == falseGibt das von der QJniObject verwaltete Objekt entweder als `jobject` oder als Typ `T` zurück. `T` kann einer der folgenden Typen sein: ` JNI Object Types`.
QJniObject string = QJniObject::fromString("Hello, JNI");
jstring jstring = string.object<jstring>();Hinweis: Das zurückgegebene Objekt wird weiterhin von diesem ` QJniObject` verwaltet. Um das Objekt über die Lebensdauer dieses ` QJniObject` hinaus zu erhalten – beispielsweise, um es für eine spätere Verwendung zu speichern –, ist es am einfachsten, es in einem anderen ` QJniObject ` mit einer geeigneten Lebensdauer abzulegen. Alternativ können Sie eine neue globale Referenz auf das Objekt erstellen und diese speichern, wobei Sie darauf achten müssen, sie freizugeben, sobald Sie sie nicht mehr benötigen.
void functionScope()
{
QString helloString("Hello");
jstring myJString = 0;
{
QJniObject string = QJniObject::fromString(helloString);
myJString = string.object<jstring>();
}
// Ops! myJString is no longer valid.
QString myQtString = QJniObject(myJString).toString();
}[since 6.2] jclass QJniObject::objectClass() const
Gibt das von QJniObject verwaltete Klassenobjekt als jclass zurück.
Hinweis: Das zurückgegebene Objekt wird weiterhin von diesem „ QJniObject “ verwaltet. Um das Objekt über die Lebensdauer dieses „ QJniObject “ hinaus zu erhalten – beispielsweise, um es für eine spätere Verwendung zu speichern –, ist es am einfachsten, es in einem anderen „ QJniObject “ mit einer geeigneten Lebensdauer zu speichern. Alternativ können Sie eine neue globale Referenz auf das Objekt erstellen und diese speichern, wobei Sie darauf achten müssen, sie freizugeben, sobald Sie sie nicht mehr benötigen.
Diese Funktion wurde in Qt 6.2 eingeführt.
template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, Type value)
Setzt den Wert von „ fieldName “ auf „ value “.
QJniObject obj;
obj.setField<jint>("AN_INT_FIELD", 10);
jstring myString = ...;
obj.setField<jstring>("A_STRING_FIELD", myString);template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, const char *signature, Type value)
Setzt den Wert von „ fieldName “ mit „ signature “ auf „ value “.
QJniObject stringArray = ...;
QJniObject obj = ...;
obj.setObjectField<jobjectArray>("KEY_VALUES", "([Ljava/lang/String;)V",
stringArray.object<jobjectArray>())[static] template <
typename Klass,
typename Ret = void,
typename Type
>
auto QJniObject::setStaticField(const char *fieldName, Type value)
Setzt das statische Feld „ fieldName “ der Klasse „ Klass “ auf „ value “.
Klass Muss ein C++-Typ sein, dessen registrierte Typzuordnung einem Java-Typ entspricht.
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, Type value)
Setzt das statische Feld „ fieldName “ der Klasse „ className “ auf „ value “.
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, Type value)
Setzt das statische Feld „ fieldName “ der Klasse „ clazz “ auf „ value “.
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, Type value)
Setzt das statische Feld „ fieldName “ der Klasse „ className “ mithilfe des Setters mit „ signature “ auf „ value “.
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value)
Setzt das statische Feld „ fieldName “ der Klasse „ clazz “ mithilfe des Setters mit „ signature “ auf „ value “.
[noexcept, since 6.8] void QJniObject::swap(QJniObject &other)
Tauscht dieses Objekt mit „ other “ aus. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.
Diese Funktion wurde in Qt 6.8 eingeführt.
QString QJniObject::toString() const
Gibt ein ` QString ` mit einer Zeichenfolgenrepräsentation des Java-Objekts zurück. Der Aufruf dieser Funktion für ein Java-String-Objekt ist eine bequeme Möglichkeit, die eigentlichen Zeichenfolgendaten abzurufen.
QJniObject string = ...; // "Hello Java"
QString qstring = string.toString(); // "Hello Java"Siehe auch ` fromString()`.
[noexcept default] QJniObject &QJniObject::operator=(QJniObject &&other)
Weist „ other “ dieser „ QJniObject “-Instanz zu.
template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)
Ersetzen Sie das aktuelle Objekt durch object. Das alte Java-Objekt wird freigegeben.
[noexcept default] QJniObject &QJniObject::operator=(const QJniObject &other)
other Weist dieser „ QJniObject “-Instanz den Wert „ “ zu.
Verwandte Nicht-Mitglieder
bool operator!=(const QJniObject &o1, const QJniObject &o2)
Gibt „true“ zurück, wenn „ o1 “ einen Verweis auf ein anderes Objekt enthält als „ o2 “.
bool operator==(const QJniObject &o1, const QJniObject &o2)
Gibt „true“ zurück, wenn beide Objekte, „ o1 “ und „ o2 “, auf dasselbe Java-Objekt verweisen oder wenn beide den Wert „NULL“ haben. In allen anderen Fällen wird „false“ zurückgegeben.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.