Auf dieser Seite

QtJniTypes Namespace

Der Namespace „QtJniTypes“ deklariert C++-Typen, die Java-Typen entsprechen. Mehr dazu...

Header: #include <QtJniTypes>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Seit: Qt 6.8

Klassen

(since Qt 6.8) class JObject

Makros

(since 6.8) Q_DECLARE_JNI_CLASS(Type, JavaSignature)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)
(since 6.8) Q_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

Ausführliche Beschreibung

Das Java Native Interface (JNI ) -Framework ermöglicht es, nativen C- oder C++-Code aufzurufen und native C- oder C++-Funktionen zu registrieren, die von Java-Code über die JVM aufgerufen werden können. In Qt bieten die Typen „ QJniObject “ und „ QJniEnvironment “ praktische Wrapper für die Nutzung von JNI.

Da die Java-Sprache, ähnlich wie C++, Überladung unterstützt, müssen Funktionen einschließlich ihrer gesamten Signaturzeichenfolge angegeben werden. Dies ist komplex, repetitiv und fehleranfällig, insbesondere wenn Funktionen mehrere Parameter haben. ` QJniObject ` bietet variadische Template-APIs, die die Signaturzeichenfolge für einen Funktionsaufruf zur Kompilierungszeit ableiten können, basierend auf den an das Template übergebenen C++-Typen. Damit dies funktioniert, muss die Zuordnung dieser C++-Typen zu den entsprechenden JNI-Zeichenfolgen zur Kompilierungszeit bekannt sein.

Qt implementiert diese Zuordnung für die Standard- JNI types. Durch die Verwendung des Makros „ Q_DECLARE_JNI_CLASS “ lässt sich die Zuordnung auf beliebige Java-Typen erweitern.

Siehe auch „ Q_DECLARE_JNI_CLASS “, „ Q_DECLARE_JNI_NATIVE_METHOD “ und „ Q_JNI_NATIVE_METHOD “.

Klassen

Klasse JObject

Die Vorlage „JObject“ im Namensraum „ QtJniTypes “ bildet die Grundlage für deklarierte Java-Typen. Mehr...

Makro-Dokumentation

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

Deklariert einen C++-Typ „ Type “ im Namespace „ QtJniTypes “, der die Java-Klasse „ JavaSignature “ umschließt. Der Name der Java-Klasse in „ JavaSignature “ muss vollständig qualifiziert sein, wobei „ / “ als Trennzeichen verwendet wird.

Q_DECLARE_JNI_CLASS(File, "java/io/File")
Q_DECLARE_JNI_CLASS(FileWriter, "java/io/FileWriter")

Die C++-Klassen „ QtJniTypes::File “ und „ QtJniTypes::FileWriter “ sind dann Typen vom Typ „ QJniObject “ (genauer gesagt Spezialisierungen von „ QtJniTypes::JObject “), die verwendet werden können, um die entsprechende Java-Klasse zu instanziieren, Methoden aufzurufen und solche Instanzen an variadische Template-Methoden von „ QJniObject “ mit automatischer Signaturableitung zur Kompilierungszeit zu übergeben.

using namespace QtJniTypes;

File file("path/to/file"); // instantiates the java.io.File type in Java
if (file.callMethod<bool>("createNewFile")) {
    FileWriter writer(file); // instantiates a java.io.FileWriter that operates on file
    writer.callMethod("write", 42);
}

Zusätzlich zur „ QJniObject “-API verfügen diese C++-Klassen auch über eine statische Memberfunktion „ registerNativeMethods “, die wie folgt verwendet werden kann:

QtJniTypes::File::registerNativeMethods({
    Q_JNI_NATIVE_METHOD(freeFunction)
});

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch „ Q_DECLARE_JNI_NATIVE_METHOD “, „ Q_JNI_NATIVE_METHOD “ und „ QtJniTypes::JObject “.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method)

Deklariert die freie C- oder C++-Funktion „ Method “ als native Methode. Die Methode kann später mithilfe des Makros „ Q_JNI_NATIVE_METHOD “ über „QJniEnvironment::registerNativeMethod()“ beim JNI-Framework registriert werden.

// C++ side

Q_DECLARE_JNI_CLASS(MyJavaType, "my/java/Type")

static void nativeFunction(JNIEnv *env, jobject thiz, jlong id)
{
    // ...
}
Q_DECLARE_JNI_NATIVE_METHOD(nativeFunction)

Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    QJniEnvironment env;
    env.registerNativeMethods<QtJniTypes::MyJavaType>({
        Q_JNI_NATIVE_METHOD(nativeFunction)
    });
}

// Java side
public class MyJavaType
{
    native public nativeFunction(long id);
}

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch Q_JNI_NATIVE_METHOD und Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)

Deklariert die freie C- oder C++-Funktion „ Method “ als native Methode, die in Java unter dem Namen „ JavaName “ verfügbar ist. Die Methode kann später mithilfe des Makros „ Q_JNI_NATIVE_METHOD “ über „QJniEnvironment::registerNativeMethod()“ im JNI-Framework registriert werden.

Dies ist eine überladene Funktion.

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch „ Q_JNI_NATIVE_METHOD “ und „ Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE “.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)

Deklariert die statische Klassenmitgliedsfunktion „ Method “ in C++ als native Methode. Die Methode kann später mithilfe des Makros „ Q_JNI_NATIVE_SCOPED_METHOD “ über „QJniEnvironment::registerNativeMethod()“ im JNI-Framework registriert werden.

class NativeHandler
{
    // ...
private:
    static void handleChange(JNIEnv*, jobject, jlong id);
    Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(handleChange)
};

\dots
QJniEnvironment env;
env.registerNativeMethods<QtJniTypes::MyJavaType>({
    Q_JNI_NATIVE_SCOPED_METHOD(handleChange, NativeHandler)
});

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch „ Q_DECLARE_JNI_NATIVE_METHOD “ und „ Q_JNI_NATIVE_SCOPED_METHOD “.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)

Deklariert die statische Klassenmitgliedsfunktion „ Method “ aus C++ als native Methode, die in Java unter dem Namen „ JavaName “ verfügbar ist. Die Methode kann später mithilfe des Makros „ Q_JNI_NATIVE_METHOD “ über „QJniEnvironment::registerNativeMethod()“ im JNI-Framework registriert werden.

Dies ist eine überladene Funktion.

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch „ Q_DECLARE_JNI_NATIVE_METHOD “ und „ Q_JNI_NATIVE_SCOPED_METHOD “.

[since 6.8] Q_JNI_NATIVE_METHOD(Method)

Stellt die bisher unter declared beschriebene native Methode Method für die Registrierung im JNI-Framework bereit. Verwenden Sie dieses Makro, wenn Sie die Methode mit QJniEnvironment::registerNativeMethod() bei JNI registrieren.

Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    QJniEnvironment env;
    env.registerNativeMethods<QtJniTypes::MyJavaType>({
        Q_JNI_NATIVE_METHOD(nativeFunction)
    });
}

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch Q_DECLARE_JNI_NATIVE_METHOD.

[since 6.8] Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

Stellt die bisher unter declared beschriebene native Methode Method im Gültigkeitsbereich Scope für die Registrierung mit dem JNI-Framework bereit. Verwenden Sie dieses Makro, wenn Sie die Methode mit QJniEnvironment::registerNativeMethod() bei JNI registrieren.

Dieses Makro wurde in Qt 6.8 eingeführt.

Siehe auch Q_JNI_NATIVE_METHOD und Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

© 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.