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

TypSignatur
jobjectLjava/lang/Objekt;
jclassLjava/lang/Klasse;
jstringLjava/lang/String;
jthrowableLjava/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

TypSignatur
jbooleanZ
jbyteB
jcharC
jshortS
jintI
jlongJ
jFloatF
jdoubleD

Andere

TypUnterschrift
voidV
Benutzerdefinierter TypL<voll-qualifizierter-Name>;

Weitere Informationen über JNI finden Sie unter Java Native Interface Specification.

Siehe auch QJniEnvironment und object().

Dokumentation der Mitgliedsfunktionen

template <typename T> T QJniObject::object() const

jobject QJniObject::object() const

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.