QtJniTypes Namespace
Der Namespace QtJniTypes deklariert C++-Typen, die Java-Typen entsprechen. Mehr...
Kopfzeile: | #include <QtJniTypes> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Seit: | Qt 6.8 |
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) |
Detaillierte Beschreibung
Das Java Native Interface Framework ermöglicht es nativem C- oder C++-Code, Java-APIs aufzurufen und native C- oder C++-Funktionen zu registrieren, die von Java-Code in der JVM aufgerufen werden können sollen. In Qt bieten die Typen QJniObject und QJniEnvironment praktische Wrapper für die Verwendung von JNI.
Da die Java-Sprache, ähnlich wie C++, das Überladen unterstützt, müssen Funktionen einschließlich ihrer gesamten Signaturzeichenfolge angegeben werden. Dies ist komplex, repetitiv und fehleranfällig, insbesondere wenn Funktionen mehrere Parameter annehmen. QJniObject bietet variable Template-APIs, die den Signaturstring für einen Funktionsaufruf zur Kompilierzeit ableiten können, basierend auf den C++-Typen, die dem Template übergeben werden. Damit dies funktioniert, muss die Zuordnung dieser C++-Typen zu ihrem entsprechenden JNI-String zur Kompilierzeit bekannt sein.
Qt implementiert dieses Mapping für den Standard JNI types. Durch die Verwendung des Q_DECLARE_JNI_CLASS Makros kann das Mapping für beliebige Java-Typen erweitert werden.
Siehe auch Q_DECLARE_JNI_CLASS, Q_DECLARE_JNI_NATIVE_METHOD, und Q_JNI_NATIVE_METHOD.
Makro-Dokumentation
[since 6.8]
Q_DECLARE_JNI_CLASS(Type, JavaSignature)
Deklariert einen C++-Typ Type im Namespace QtJniTypes, der die Java-Klasse JavaSignature umhüllt. Der Java-Klassenname in JavaSignature muss vollständig qualifiziert werden, 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 QJniObject-ähnliche Typen, die verwendet werden können, um die entsprechende Java-Klasse zu instanziieren, Methoden aufzurufen und solche Instanzen durch QJniObject variadische Template-Methoden mit automatischer Signaturdeduktion zur Kompilierzeit 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 haben diese C++-Klassen auch eine statische registerNativeMethods
Mitgliedsfunktion, die wie diese 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 und Q_JNI_NATIVE_METHOD.
[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 mit Hilfe des Makros Q_JNI_NATIVE_METHOD mit dem JNI-Framework über QJniEnvironment::registerNativeMethod() 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)
Dies ist eine überladene Funktion.
Deklariert die freie C- oder C++-Funktion Method zu einer nativen Methode, die in Java als JavaName verfügbar ist. Die Methode kann später im JNI-Framework mit QJniEnvironment::registerNativeMethod() mit Hilfe des Makros Q_JNI_NATIVE_METHOD registriert werden.
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 C++-Klassenfunktion Method als native Methode. Die Methode kann später mit Hilfe des Makros Q_JNI_NATIVE_SCOPED_METHOD mit dem JNI-Framework über QJniEnvironment::registerNativeMethod() 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)
Dies ist eine überladene Funktion.
Deklariert die statische C++-Klassenfunktion Method zu einer nativen Methode, die in Java als JavaName verfügbar ist. Die Methode kann später im JNI-Framework mit QJniEnvironment::registerNativeMethod() mit Hilfe des Makros Q_JNI_NATIVE_METHOD registriert werden.
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)
Macht die zuvor declared native Methode Method für die Registrierung mit dem JNI-Framework verfügbar. Verwenden Sie dieses Makro, wenn Sie die Methode bei JNI mit QJniEnvironment::registerNativeMethod() 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)
Macht die zuvor declared native Methode Method im Bereich Scope für die Registrierung mit dem JNI-Framework verfügbar. Verwenden Sie dieses Makro, wenn Sie die Methode bei JNI mit QJniEnvironment::registerNativeMethod() 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.
© 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.