QJniObject Class
Ein bequemer Wrapper um das Java Native Interface (JNI). Mehr...
Kopfzeile: | #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() | |
(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 |
void | setField(const char *fieldName, T value) |
void | setField(const char *fieldName, const char *signature, T value) |
(since 6.8) void | swap(QJniObject &other) |
QString | toString() const |
QJniObject & | operator=(T object) |
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) QJniObject | 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, T value) |
void | setStaticField(const char *className, const char *fieldName, T value) |
void | setStaticField(jclass clazz, 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) |
Verwandte Nicht-Mitglieder
bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
bool | operator==(const QJniObject &o1, const QJniObject &o2) |
Detaillierte Beschreibung
Die Klasse QJniObject umhüllt einen Verweis auf ein Java-Objekt, stellt sicher, dass es nicht im Müll landet und bietet Zugriff auf die meisten JNIEnv
Methodenaufrufe (member, static) und Felder (setter, getter). Sie eliminiert viel Boiler-Plate, das normalerweise mit direktem JNI-Zugriff für jede Operation, einschließlich Ausnahmebehandlung, erforderlich wäre.
Hinweis: Diese API wurde für die Verwendung mit Android entwickelt und getestet. Sie wurde nicht für andere Plattformen getestet.
Methoden-Signaturen
QJniObject bietet Komfortfunktionen, die auf der Grundlage der bereitgestellten 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. Nur der Rückgabetyp muss explizit angegeben werden. QJniObject kann die Signaturzeichenfolge für Funktionen ableiten, die JNI types annehmen, und für Typen, die mit der QtJniTypes type mapping 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 in C++-Code, ohne dass JNI-Signaturstrings explizit erstellt werden müssen.
Explizite JNI-Signaturen
Es ist möglich, die Signatur selbst zu erstellen. In diesem Fall ist es wichtig, dass die Signatur mit der Funktion übereinstimmt, die Sie aufrufen möchten.
- Klassennamen müssen vollständig qualifiziert sein, zum Beispiel:
"java/lang/String"
. - Methodensignaturen werden als
"(ArgumentsTypes)ReturnType"
geschrieben, siehe JNI Types. - Alle Objekttypen werden als QJniObject zurückgegeben.
Das folgende Beispiel zeigt, wie man verschiedene statische Funktionen aufruft:
Die Signaturstruktur ist "(ArgumentsTypes)ReturnType"
. Array-Typen in der Signatur müssen das Präfix [
haben, und die voll qualifizierten Object
Typnamen müssen das Präfix L
und das Suffix ;
haben. Die Signatur für die Funktion create
ist "()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 uns auf die QJniObject-Vorlagenmethoden verlassen, um die implizite Signaturzeichenfolge zu erstellen, aber wir können die Signaturzeichenfolge 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 aber dennoch ein QJniObject zurückgibt.
Behandlung von Java-Ausnahmen
Nach dem Aufruf von Java-Funktionen, die Ausnahmen auslösen können, ist es wichtig, jede Ausnahme zu prüfen, zu behandeln und zu löschen, bevor man fortfährt. Alle QJniObject-Funktionen behandeln Ausnahmen intern, indem sie sie melden und löschen, so dass der Client-Code keine Ausnahmen behandeln muss.
Hinweis: Der Benutzer muss Ausnahmen manuell behandeln, wenn er JNI-Aufrufe mit JNIEnv
direkt ausführt. Es ist unsicher, andere JNI-Aufrufe durchzuführen, wenn Ausnahmen anstehen. Für weitere Informationen siehe QJniEnvironment::checkAndClearExceptions().
Native Java-Methoden
Mit nativen Java-Methoden ist es möglich, nativen Code von Java aus aufzurufen. Dies geschieht durch die Erstellung einer Funktionsdeklaration in Java und das Voranstellen des Schlüsselworts native
. Bevor eine native Funktion von Java aus aufgerufen werden kann, müssen Sie die native Java-Funktion auf eine native Funktion in Ihrem Code abbilden. Das Mapping von Funktionen kann durch den Aufruf von QJniEnvironment::registerNativeMethods() erfolgen.
Das folgende Beispiel zeigt, wie dies geschehen 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() { // Registrieren Sie zuerst die nativen Methoden, idealerweise beim Start der App 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); // Aufruf der Java-Methode, die auf die C++-Funktionen zurückgreift 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 Lebenszeit eines Java-Objekts
Die meisten objects, die von Java empfangen werden, sind lokale Referenzen und bleiben nur so lange gültig, bis Sie aus der nativen Methode zurückkehren. Danach kommt das Objekt für die Garbage Collection in Frage. Wenn Ihr Code viele lokale Referenzen in einer Schleife erzeugt, sollten Sie diese bei jeder Iteration manuell löschen, da Ihnen sonst der Speicher ausgehen könnte. Weitere Informationen finden Sie unter JNI Design Overview: Globale und lokale Referenzen. Lokale Referenzen, die außerhalb eines nativen Methodenbereichs erstellt werden, müssen manuell gelöscht werden, da der Garbage Collector sie nicht automatisch freigibt, da wir AttachCurrentThread verwenden. Für weitere Informationen siehe JNI Tipps: Lokale und globale Referenzen.
Wenn Sie ein Java-Objekt am Leben erhalten wollen, müssen Sie entweder eine neue globale Referenz auf das Objekt erstellen und diese freigeben, wenn Sie fertig sind, oder ein neues QJniObject konstruieren und es die Lebensdauer des Java-Objekts verwalten lassen.
Hinweis: Das QJniObject verwaltet nur seine eigenen Referenzen. Wenn Sie ein QJniObject aus einer globalen oder lokalen Referenz konstruieren, wird diese Referenz nicht vom QJniObject freigegeben.
JNI-Typen
Objekttypen
Typ | Signatur |
---|---|
jobject | Ljava/lang/Objekt; |
jclass | Ljava/lang/Klasse; |
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 |
Andere
Typ | Unterschrift |
---|---|
void | V |
Benutzerdefinierter Typ | L<voll-qualifizierter-Name>; |
Weitere Informationen über JNI finden Sie unter Java Native Interface Specification.
Siehe auch QJniEnvironment und object().
Dokumentation der Mitgliedsfunktionen
Gibt das Objekt zurück, das sich im Besitz von QJniObject befindet, entweder als jobject oder als Typ T. T kann einer von JNI Object Types sein.
QJniObject string = QJniObject::fromString("Hello, JNI"); jstring jstring = string.object<jstring>();
Hinweis: Das zurückgegebene Objekt wird von diesem QJniObject am Leben gehalten. Um das Objekt über die Lebensdauer dieses QJniObject hinaus am Leben zu erhalten, zum Beispiel um es für eine spätere Verwendung aufzuzeichnen, ist es am einfachsten, es in einem anderen QJniObject mit einer geeigneten Lebensdauer zu speichern. Alternativ können Sie einen neuen globalen Verweis auf das Objekt erstellen und es speichern, wobei Sie darauf achten, dass Sie es wieder freigeben, wenn Sie es 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. }
QJniObject::QJniObject()
Konstruiert ein ungültiges JNI-Objekt.
Siehe auch isValid().
[explicit]
QJniObject::QJniObject(const char *className)
Konstruiert ein neues JNI-Objekt durch Aufruf des Standardkonstruktors von className.
QJniObject myJavaString("java/lang/String");
[explicit]
QJniObject::QJniObject(jclass clazz)
Konstruiert ein neues JNI-Objekt durch Aufruf des Standardkonstruktors von clazz.
Hinweis: Das QJniObject erstellt eine neue Referenz auf die Klasse clazz und gibt sie wieder frei, wenn es zerstört wird. Referenzen auf die Klasse, die außerhalb des QJniObjects erstellt werden, müssen vom Aufrufer verwaltet werden.
QJniObject::QJniObject(jobject object)
Konstruiert ein neues JNI-Objekt um das Java-Objekt object.
Hinweis: Das QJniObject hält einen Verweis auf das Java-Objekt object und gibt ihn frei, wenn es zerstört wird. Alle Verweise auf das Java-Objekt object außerhalb von QJniObject müssen vom Aufrufer verwaltet werden. In den meisten Fällen sollten Sie diese Funktion nie mit einem lokalen Verweis aufrufen, es sei denn, Sie beabsichtigen, den lokalen Verweis selbst zu verwalten. Siehe QJniObject::fromLocalRef() für die Umwandlung einer lokalen Referenz in ein QJniObject.
Siehe auch fromLocalRef().
[explicit, since 6.4]
template <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)
Konstruiert ein neues JNI-Objekt durch Aufruf des Konstruktors von className mit den Argumenten args. 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)
Konstruiert ein neues JNI-Objekt aus clazz durch Aufruf des Konstruktors mit den Argumenten args. 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, ...)
Konstruiert ein neues JNI-Objekt, indem es den Konstruktor von className mit signature aufruft, der 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, ...)
Konstruiert ein neues JNI-Objekt aus clazz, indem es den Konstruktor mit signature aufruft und die Typen aller nachfolgenden Argumente angibt.
QJniEnvironment env; jclass myClazz = env.findClass("org/qtproject/qt/TestClass"); QJniObject(myClazz, "(I)V", 3);
[noexcept]
QJniObject::~QJniObject()
Zerstört das JNI-Objekt und gibt alle vom JNI-Objekt gehaltenen Referenzen frei.
[since 6.4]
template <typename Ret, 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 (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, ist der zurückgegebene Wert ein QJniObject.
QJniObject myJavaString("org/qtproject/qt/TestClass"); jint size = myJavaString.callMethod<jint>("length");
Die Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet.
Diese Funktion wurde in Qt 6.4 eingeführt.
[since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const
Ruft die Objektmethode methodName mit signature auf, wobei die Typen der nachfolgenden Argumente args angegeben werden, und gibt den Wert zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, 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 Java-Objekte-Methode methodName mit 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 Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet.
Diese Funktion wurde in Qt 6.4 eingeführt.
QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const
Ruft die Methode des Java-Objekts methodName mit signature auf, wobei die Typen aller nachfolgenden Argumente angegeben werden.
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 Ret, typename... Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
Ruft die statische Methode methodName der Klasse Klass
auf und gibt den Wert des Typs Ret
zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, ist der zurückgegebene Wert ein QJniObject.
Die Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet. Klass
muss ein C++-Typ mit einer registrierten Typzuordnung zu einem Java-Typ sein.
Diese Funktion wurde in Qt 6.7 eingeführt.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)
Ruft die statische Methode methodName für die Klasse className mit den Argumenten args auf und gibt den Wert des Typs Ret
zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, ist der zurückgegebene Wert ein QJniObject.
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");
Die Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)
Ruft die statische Methode methodName auf clazz auf und gibt den Wert des Typs Ret
zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, ist der zurückgegebene Wert ein QJniObject.
QJniEnvironment env; jclass javaMathClass = env.findClass("java/lang/Math"); jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");
Die Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)
Ruft die durch methodId identifizierte statische Methode der Klasse clazz mit allen nachfolgenden Argumenten auf und gibt den Wert des Typs Ret
zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, ist der zurückgegebene Wert ein QJniObject.
Nützlich, wenn clazz und methodId bereits von 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, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
Ruft die statische Methode methodName der Klasse className auf, wobei signature die Typen aller nachfolgenden Argumente args angibt. Gibt das Ergebnis der Methode zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, dann 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, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)
Ruft die statische Methode methodName von clazz auf, wobei signature die Typen aller nachfolgenden Argumente angibt. Gibt das Ergebnis der Methode zurück (sofern Ret
nicht void
ist). Wenn Ret
ein Jobject-Typ ist, 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 auf der Klasse className auf, wobei Argumente args übergeben werden, und gibt ein neues QJniObject für das zurückgegebene Java-Objekt zurück.
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");
Die Signatur der Methode wird zur Kompilierzeit aus Ret
und den Typen von args abgeleitet.
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 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 identifizierte statische Methode der Klasse clazz mit allen nachfolgenden Argumenten auf. Nützlich, wenn clazz und methodId bereits von früheren Operationen 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 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 QJniObject als QByteArray
gehalten wird.
Diese Funktion wurde in Qt 6.2 eingeführt.
[static, since 6.4]
template <typename Class, typename... Args> QJniObject QJniObject::construct(Args &&... args)
Konstruiert eine Instanz der Java-Klasse, die das Äquivalent von Class
ist, 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 bekannt sind JNI Types.
Diese Funktion wurde in Qt 6.4 eingeführt.
[static]
QJniObject QJniObject::fromLocalRef(jobject localRef)
Erzeugt eine QJniObject aus der lokalen JNI-Referenz localRef. Diese Funktion übernimmt das Eigentum an localRef und gibt es vor der Rückkehr wieder frei.
Hinweis: Rufen Sie diese Funktion nur mit einer lokalen JNI-Referenz auf. Zum Beispiel geben die meisten rohen 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)
Erzeugt eine Java-Zeichenkette aus der QString string und gibt eine QJniObject mit dieser Zeichenkette zurück.
QString myQString = "QString"; QJniObject myJavaString = QJniObject::fromString(myQString);
Siehe auch toString().
template <typename T> 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 auch 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 für die Klasse Klass
ab.
Klass
muss ein C++-Typ mit einer registrierten Typzuordnung zu einem Java-Typ sein.
[static]
template <typename T> auto QJniObject::getStaticField(const char *className, const char *fieldName)
Ruft den Wert aus dem statischen Feld fieldName der Klasse className ab.
[static]
template <typename T> auto QJniObject::getStaticField(jclass clazz, const char *fieldName)
Ruft den Wert aus dem statischen Feld fieldName auf 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 auf 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 signature aus der Klasse className ab.
Hinweis: Diese Funktion kann ohne Vorlagentyp 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 signature aus der Klasse clazz ab.
Hinweis: Diese Funktion kann ohne Vorlagentyp 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() == false
[since 6.2]
jclass QJniObject::objectClass() const
Gibt das Klassenobjekt zurück, das von QJniObject als jclass
gehalten wird.
Hinweis: Das zurückgegebene Objekt wird von diesem QJniObject am Leben gehalten. Um das Objekt über die Lebensdauer dieses QJniObject hinaus am Leben zu erhalten, zum Beispiel um es für eine spätere Verwendung aufzuzeichnen, ist es am einfachsten, es in einem anderen QJniObject mit einer geeigneten Lebensdauer zu speichern. Alternativ können Sie einen neuen globalen Verweis auf das Objekt erstellen und es speichern, wobei Sie darauf achten müssen, es wieder freizugeben, wenn Sie es nicht mehr benötigen.
Diese Funktion wurde in Qt 6.2 eingeführt.
template <typename T> void QJniObject::setField(const char *fieldName, T 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 T> void QJniObject::setField(const char *fieldName, const char *signature, T 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 T> auto QJniObject::setStaticField(const char *fieldName, T value)
Setzt das statische Feld fieldName der Klasse Klass
auf value.
Klass
muss ein C++-Typ mit einer registrierten Typzuordnung zu einem Java-Typ sein.
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, T value)
Setzt das statische Feld fieldName der Klasse className auf value.
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, T value)
Setzt das statische Feld fieldName der Klasse clazz auf value.
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, T value)
Setzt das statische Feld fieldName der Klasse className über den Setter mit signature auf value.
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, T value)
Setzt das statische Feld fieldName der Klasse clazz über den Setter 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 nie fehl.
Diese Funktion wurde in Qt 6.8 eingeführt.
QString QJniObject::toString() const
Gibt eine QString mit einer String-Darstellung des Java-Objekts zurück. Der Aufruf dieser Funktion für ein Java-String-Objekt ist ein bequemer Weg, um die tatsächlichen String-Daten zu erhalten.
QJniObject string = ...; // "Hello Java" QString qstring = string.toString(); // "Hello Java"
Siehe auch fromString().
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.
Verwandte Nicht-Mitglieder
bool operator!=(const QJniObject &o1, const QJniObject &o2)
Gibt true zurück, wenn o1 einen Verweis auf ein anderes Objekt als o2 enthält.
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 NULL sind. In allen anderen Fällen wird false zurückgegeben.
© 2025 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.