Sur cette page

QtJniTypes Namespace

L'espace de noms QtJniTypes déclare les types C++ qui correspondent aux types Java. Plus...

En-tête : #include <QtJniTypes>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Depuis : Qt 6.8

Classes

(since Qt 6.8) class JObject

Macros

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

Description détaillée

Le framework Java Native Interface permet au code C ou C++ natif d'appeler les API Java et d'enregistrer les fonctions C ou C++ natives que le code Java devrait être capable d'appeler avec la JVM. Dans Qt, les types QJniObject et QJniEnvironment fournissent des enveloppes pratiques pour l'utilisation de JNI.

Étant donné que le langage Java, comme le langage C++, prend en charge la surcharge, les fonctions doivent être spécifiées en incluant l'intégralité de leur chaîne de signature. Cela est complexe, répétitif et source d'erreurs, en particulier lorsque les fonctions prennent plusieurs paramètres. QJniObject fournit des API de modèles variables qui peuvent déduire la chaîne de signature d'un appel de fonction au moment de la compilation, sur la base des types C++ passés dans le modèle. Pour que cela fonctionne, la correspondance entre ces types C++ et la chaîne JNI correspondante doit être connue au moment de la compilation.

Qt XML implémente cette correspondance pour le standard JNI types. En utilisant la macro Q_DECLARE_JNI_CLASS, la correspondance peut être étendue à des types Java arbitraires.

Voir aussi Q_DECLARE_JNI_CLASS, Q_DECLARE_JNI_NATIVE_METHOD, et Q_JNI_NATIVE_METHOD.

Classes

Classe JObject

Le modèle JObject de l'espace de noms QtJniTypes est la base des types Java déclarés. Plus d'informations...

Documentation sur les macros

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

Déclare un type C++ Type dans l'espace de noms QtJniTypes qui englobe la classe Java JavaSignature. Le nom de la classe Java dans JavaSignature doit être entièrement qualifié, en utilisant / comme séparateur.

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

Les classes C++ QtJniTypes::File et QtJniTypes::FileWriter sont alors des types similaires à QJniObject(des spécialisations de QtJniTypes::JObject, pour être précis) qui peuvent être utilisés pour instancier la classe Java correspondante, pour appeler des méthodes et pour faire passer ces instances par des méthodes modèles variadiques QJniObject avec déduction automatique de la signature au moment de la compilation.

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

En plus de l'API QJniObject, ces classes C++ ont également une fonction membre statique registerNativeMethods qui peut être utilisée de cette manière :

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

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_DECLARE_JNI_NATIVE_METHOD, Q_JNI_NATIVE_METHOD, et QtJniTypes::JObject.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method)

Déclare la fonction C ou C++ libre Method comme méthode native. La méthode peut ensuite être enregistrée auprès du cadre JNI à l'aide de QJniEnvironment::registerNativeMethod() avec l'aide de la macro Q_JNI_NATIVE_METHOD.

// 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);
}

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_JNI_NATIVE_METHOD et Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)

Déclare la fonction C ou C++ libre Method comme une méthode native disponible en Java sous la forme JavaName. La méthode peut ensuite être enregistrée auprès du cadre JNI à l'aide de QJniEnvironment::registerNativeMethod() avec l'aide de la macro Q_JNI_NATIVE_METHOD.

Il s'agit d'une fonction surchargée.

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_JNI_NATIVE_METHOD et Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)

Déclare la fonction membre statique de la classe C++ Method comme méthode native. La méthode peut ensuite être enregistrée auprès du cadre JNI à l'aide de QJniEnvironment::registerNativeMethod() avec l'aide de la macro Q_JNI_NATIVE_SCOPED_METHOD.

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

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_DECLARE_JNI_NATIVE_METHOD et Q_JNI_NATIVE_SCOPED_METHOD.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)

Déclare la fonction membre statique de la classe C++ Method comme une méthode native disponible en Java sous la forme JavaName. La méthode peut ensuite être enregistrée auprès du cadre JNI à l'aide de QJniEnvironment::registerNativeMethod() avec l'aide de la macro Q_JNI_NATIVE_METHOD.

Il s'agit d'une fonction surchargée.

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_DECLARE_JNI_NATIVE_METHOD et Q_JNI_NATIVE_SCOPED_METHOD.

[since 6.8] Q_JNI_NATIVE_METHOD(Method)

Method Rend la méthode native declared disponible pour l'enregistrement avec le cadre JNI. Utilisez cette macro lors de l'enregistrement de la méthode avec JNI en utilisant QJniEnvironment::registerNativeMethod().

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

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_DECLARE_JNI_NATIVE_METHOD.

[since 6.8] Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

Rend la méthode native declared Method dans la portée Scope disponible pour l'enregistrement avec le cadre JNI. Utilisez cette macro lors de l'enregistrement de la méthode avec JNI en utilisant QJniEnvironment::registerNativeMethod().

Cette macro a été introduite dans Qt 6.8.

Voir aussi Q_JNI_NATIVE_METHOD et 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.