Sur cette page

QJniObject Class

Une interface de commodité autour de l'interface native Java (JNI). En savoir plus...

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

Fonctions publiques

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(const QJniObject &other)
QJniObject(QJniObject &&other)
~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
auto setField(const char *fieldName, Type value)
auto setField(const char *fieldName, const char *signature, Type value)
(since 6.8) void swap(QJniObject &other)
QString toString() const
QJniObject &operator=(QJniObject &&other)
QJniObject &operator=(T object)
QJniObject &operator=(const QJniObject &other)

Membres publics statiques

(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) auto 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, Type value)
auto setStaticField(const char *className, const char *fieldName, Type value)
auto setStaticField(jclass clazz, const char *fieldName, Type value)
auto setStaticField(const char *className, const char *fieldName, const char *signature, Type value)
auto setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value)
bool operator!=(const QJniObject &o1, const QJniObject &o2)
bool operator==(const QJniObject &o1, const QJniObject &o2)

Description détaillée

La classe QJniObject encapsule une référence à un objet Java, garantissant ainsi qu’il ne sera pas supprimé par le ramasse-miettes et permettant d’accéder à la plupart des appels de méthodes ( JNIEnv, membres, statiques) et des champs (setter, getter) de cet objet. Elle élimine une grande partie du code standard qui serait normalement nécessaire, avec un accès JNI direct, pour chaque opération. Les exceptions levées par les méthodes Java appelées sont ignorées par défaut, mais peuvent également, depuis Qt 6.11, être gérées par l'appelant.

Remarque : cette API a été conçue et testée pour une utilisation sous Android. Elle n’a pas été testée sur d’autres plateformes.

Signatures de méthodes

QJniObject fournit des fonctions pratiques qui utiliseront la signature appropriée en fonction des arguments de modèle fournis ou déduits.

jint x = QJniObject::callMethod<jint>("getSize");
QJniObject::callMethod<void>("touch");
jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());

Ces fonctions sont des modèles variadiques, et le compilateur déduira la signature à partir des types d’arguments réels. Seul le type de retour doit être fourni explicitement. QJniObject peut déduire la chaîne de signature pour les fonctions prenant des arguments de type ` JNI types`, ainsi que pour les types ayant été déclarés avec le mappage de type ` QtJniTypes `.

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

Cela permet d'utiliser des types Java et Android arbitraires dans du code C++, sans avoir à créer explicitement de chaînes de signature JNI.

Signatures JNI explicites

Il est possible de fournir soi-même la signature. Dans ce cas, il est important que la signature corresponde à la fonction que vous souhaitez appeler.

  • Les noms de classes doivent être pleinement qualifiés, par exemple : "java/lang/String".
  • Les signatures de méthodes s'écrivent sous la forme "(ArgumentsTypes)ReturnType", voir JNI Types.
  • Tous les types d'objets sont renvoyés sous la forme d'un QJniObject.

L'exemple ci-dessous montre comment appeler différentes fonctions statiques :

La structure de la signature est "(ArgumentsTypes)ReturnType". Les types de tableaux dans la signature doivent être précédés du préfixe [, et les noms de types Object s complets doivent être précédés du préfixe L et suivis du suffixe ;. La signature de la fonction create est "()Lorg/qtproject/qt/TestClass;. Les signatures des deuxième et troisième fonctions sont respectivement "(I)Ljava/lang/String;" et "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;".

Nous pouvons appeler la fonction ` create() ` comme suit :

// C++ code
QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
                                                          "create",
                                                          "()Lorg/qtproject/qt/TestClass;");

Pour les deuxième et troisième fonctions, nous pouvons nous appuyer sur les méthodes de modèle de `QJniObject` pour créer la chaîne de signature implicite, mais nous pouvons également passer la chaîne de signature explicitement :

// C++ code
QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
                                                             "fromNumber",
                                                             "(I)Ljava/lang/String;", 10);

Pour que la création implicite de la signature fonctionne, nous devons spécifier explicitement le type de retour :

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

Notez que même si le premier paramètre de modèle spécifie le type de retour de la fonction Java, la méthode renverra tout de même un QJniObject.

Gestion des exceptions Java

Après avoir appelé des fonctions Java susceptibles de lever des exceptions, il est important de vérifier, de gérer et de résorber toute exception avant de poursuivre. Toutes les fonctions QJniObject peuvent gérer les exceptions en interne en les signalant et en les effaçant. Cela inclut les exceptions JNI, par exemple lors d’une tentative d’appel d’une méthode inexistante ou avec des paramètres incorrects ; ainsi que les exceptions levées par la méthode pour signaler des erreurs ou renvoyer des informations d’échec.

À partir de Qt 6.11, le code client peut choisir de gérer explicitement les exceptions à chaque appel. Pour ce faire, utilisez ` std::expected ` de C++ 23 comme type de retour, avec le type de valeur attendu, et ` jthrowable ` comme type d'erreur. Par exemple, tenter de lire la valeur d’un paramètre via le type ` android.provider.Settings.Secure ` peut déclencher une exception si ce paramètre n’existe pas.

Q_DECLARE_JNI_CLASS(SettingsSecure, "android/provider/Settings$Secure")
using namespace QtJniTypes;

QString enabledInputMethods()
{
    ContentResolver resolver;
    SettingsSecure settings;

    auto defaultInputMethods = settings.callMethod<std::expected<QString, jthrowable>>(
        "getString", resolver, u"enabled_input_methods"_s
    );
    if (defaultInputMethods)
        return defaultInputMethods.value();
    QStringList stackTrace = QJniEnvironment::stackTrace(defaultInputMethods.error());
}

Vous pouvez utiliser n’importe quel autre type se comportant comme ` std::expected`, ce qui permet de gérer explicitement les exceptions sans recourir au C++23. Les seules conditions requises sont que le type déclare trois types imbriqués : ` value_type`, ` error_type` et ` unexpected_type`, qu’il puisse être construit à partir du type de valeur, et à partir de son ` unexpected_type ` contenant un ` jthrowable`.

Remarque : l’utilisateur doit gérer manuellement les exceptions lorsqu’il effectue des appels JNI en utilisant directement ` JNIEnv `. Il est dangereux d’effectuer d’autres appels JNI lorsque des exceptions sont en attente. Pour plus d’informations, voir ` QJniEnvironment::checkAndClearExceptions()`.

Méthodes natives Java

Les méthodes natives Java permettent d’appeler du code natif depuis Java. Pour ce faire, il suffit de créer une déclaration de fonction en Java et de la préfixer avec le mot-clé native. Avant de pouvoir appeler une fonction native depuis Java, vous devez mapper la fonction native Java à une fonction native dans votre code. Le mappage des fonctions s’effectue en appelant QJniEnvironment::registerNativeMethods().

L'exemple ci-dessous illustre la manière de procéder.

Implémentation Java :

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

}

Implémentation en C++ :

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()
{
    // enregistrer d'abord les méthodes natives ; idéalement, cela devrait être fait au démarrage de l'application
    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);

    // Appel de la méthode Java qui appellera à son tour les fonctions C++
    QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10);  // Résultat : 10 < 100
    QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Résultat : 100 >= 100
}

La durée de vie d'un objet Java

La plupart des objects s reçues depuis Java sont des références locales et ne restent valides que jusqu’à ce que vous sortiez de la méthode native. Passé ce délai, l’objet peut être récupéré par le ramasse-miettes. Si votre code crée de nombreuses références locales dans une boucle, vous devez les supprimer manuellement à chaque itération, sous peine de manquer de mémoire. Pour plus d’informations, consultez la section « Présentation de la conception JNI : références globales et locales ». Les références locales créées en dehors de la portée d’une méthode native doivent être supprimées manuellement, car le ramasse-miettes ne les libérera pas automatiquement, étant donné que nous utilisons `AttachCurrentThread`. Pour plus d’informations, consultez la section « Conseils JNI : références locales et globales ».

Si vous souhaitez maintenir un objet Java en vie, vous devez soit créer une nouvelle référence globale vers cet objet et la libérer lorsque vous avez terminé, soit construire un nouvel objet `QJniObject` et lui laisser gérer le cycle de vie de l’objet Java.

Remarque : le ` QJniObject` ne gère que ses propres références ; si vous créez un `QJniObject` à partir d’une référence globale ou locale, cette référence ne sera pas libérée par le `QJniObject`.

Types JNI

Types d'objets

TypeSignature
jobjectLjava/lang/Object;
jclassLjava/lang/Class;
jstringLjava/lang/String;
jthrowableLjava/lang/Throwable;
jobjectArray[Ljava/lang/Object;
jarray[<type>
jbooleanArray[Z
jbyteArray[B
jcharArray[C
jshortArray[S
jintArray[I
jlongArray[J
jfloatArray[F
jdoubleArray[D

Types primitifs

TypeSignature
jbooleanZ
jbyteB
jcharC
jshortS
jintI
jlongJ
jfloatF
jdoubleD

Autres

TypeSignature
nullV
Type personnaliséL<nom-pleinement-qualifié>;

Pour plus d’informations sur JNI, consultez la spécification de l’interface native Java.

Voir également QJniEnvironment et object().

Documentation sur les fonctions membres

QJniObject::QJniObject()

Crée un objet JNI non valide.

Voir également isValid().

[explicit] QJniObject::QJniObject(const char *className)

Crée un nouvel objet JNI en appelant le constructeur par défaut de ` className`.

QJniObject myJavaString("java/lang/String");

[explicit] QJniObject::QJniObject(jclass clazz)

Crée un nouvel objet JNI en appelant le constructeur par défaut de ` clazz`.

Remarque : l'objet `QJniObject` crée une nouvelle référence à la classe ` clazz ` et la libère à nouveau lorsqu'il est détruit. Les références à la classe créées en dehors de l'objet `QJniObject` doivent être gérées par l'appelant.

QJniObject::QJniObject(jobject object)

Crée un nouvel objet JNI autour de l'objet Java object.

Remarque : le QJniObject conservera une référence à l’objet Java object et la libérera lors de sa destruction. Toute référence à l’objet Java object en dehors de QJniObject doit être gérée par l’appelant. Dans la plupart des cas, vous ne devriez jamais appeler cette fonction avec une référence locale, sauf si vous avez l’intention de gérer vous-même cette référence locale. Voir QJniObject::fromLocalRef() pour convertir une référence locale en QJniObject.

Voir également fromLocalRef().

[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)

Crée un nouvel objet JNI en appelant le constructeur de ` className ` avec les arguments ` args`. Ce constructeur n'est disponible que si toutes les ` args ` sont connues ` JNI Types`.

QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", myJStringArg);

Cette fonction a été introduite dans Qt 6.4.

[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(jclass clazz, Args &&... args)

Crée un nouvel objet JNI à partir de ` clazz ` en appelant le constructeur avec les arguments ` args`. Ce constructeur n'est disponible que si tous les ` args ` sont connus ` JNI Types`.

QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, 3);

Cette fonction a été introduite dans Qt 6.4.

[explicit] QJniObject::QJniObject(const char *className, const char *signature, ...)

Crée un nouvel objet JNI en appelant le constructeur de ` className `, avec ` signature ` spécifiant les types de tous les arguments suivants.

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

Crée un nouvel objet JNI à partir de ` clazz ` en appelant le constructeur avec ` signature `, en spécifiant les types de tous les arguments suivants.

QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, "(I)V", 3);

[noexcept default] QJniObject::QJniObject(const QJniObject &other)

Crée une instance de ` QJniObject` par copie.

[noexcept default] QJniObject::QJniObject(QJniObject &&other)

Crée par construction une instance de ` QJniObject`.

[noexcept] QJniObject::~QJniObject()

Détruit l'objet JNI et libère toutes les références détenues par celui-ci.

[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const

Appelle la méthode methodName avec les arguments args et renvoie la valeur (sauf si Ret est de type void). Si Ret est de type jobject, la valeur renvoyée sera alors un QJniObject.

QJniObject myJavaString("org/qtproject/qt/TestClass");
jint size = myJavaString.callMethod<jint>("length");

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de args. Ret peut être un type compatible avec std::expected qui renvoie une valeur, ou any Java exception thrown par la méthode appelée.

Cette fonction a été introduite dans Qt 6.4.

[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const

Appelle la méthode ` methodName ` de l'objet avec ` signature ` spécifiant les types de tous les arguments suivants ` args`, et renvoie la valeur (à moins que `Ret` ne soit de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera un ` QJniObject`.

QJniObject myJavaString("org/qtproject/qt/TestClass");
jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);

Cette fonction a été introduite dans Qt 6.4.

[since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&... args) const

Appelle la méthode ` methodName ` de l'objet Java avec les arguments ` args ` et renvoie un nouvel objet ` QJniObject ` pour l'objet Java renvoyé.

QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de ` args`. Ret peut être un type compatible avec ` std::expected` qui renvoie une valeur, ou ` any Java exception thrown ` de la méthode appelée.

Cette fonction a été introduite dans Qt 6.4.

QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const

Appelle la méthode ` methodName ` de l'objet Java avec ` signature `, en précisant les types des arguments suivants.

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 ReturnType = void, typename... Args > auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)

Appelle la méthode statique ` methodName ` de la classe ` Klass ` et renvoie la valeur de type `Ret` (à moins que `Ret` ne soit de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera un ` QJniObject`.

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de args. Klass doit être un type C++ disposant d’un mappage de type enregistré vers un type Java. Ret peut être un type compatible avec std::expected qui renvoie une valeur, ou un any Java exception thrown par la méthode appelée.

Cette fonction a été introduite dans Qt 6.7.

[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)

Appelle la méthode statique ` methodName ` de la classe ` className ` avec les arguments ` args`, et renvoie la valeur de type `Ret` (à moins que `Ret` ne soit de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera un ` QJniObject`.

jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de args. Ret peut être un type compatible avec std::expected qui renvoie une valeur, ou any Java exception thrown par la méthode appelée.

Cette fonction a été introduite dans Qt 6.4.

[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)

Appelle la méthode statique ` methodName ` sur ` clazz ` et renvoie la valeur de type `Ret` (à moins que `Ret` ne soit de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera un ` QJniObject`.

QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de ` args`. Ret peut être un type compatible avec ` std::expected` qui renvoie une valeur, ou ` any Java exception thrown ` par la méthode appelée.

Cette fonction a été introduite dans Qt 6.4.

[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)

Appelle la méthode statique identifiée par ` methodId ` de la classe ` clazz ` avec les arguments qui suivent, et renvoie la valeur de type `Ret` (à moins que `Ret` ne soit de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera alors un ` QJniObject`.

Utile lorsque clazz et methodId sont déjà mis en cache à la suite d’opérations précédentes.

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

Cette fonction a été introduite dans Qt 6.4.

[static, since 6.4] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)

Appelle la méthode statique ` methodName ` de la classe ` className `, avec ` signature ` spécifiant les types de tous les arguments suivants ` args`. Renvoie le résultat de la méthode (sauf si `Ret` est ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera alors un ` QJniObject`.

jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);

Cette fonction a été introduite dans Qt 6.4.

[static] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)

Appelle la méthode statique ` methodName ` de ` clazz ` avec ` signature `, en spécifiant les types de tous les arguments suivants. Renvoie le résultat de la méthode (sauf si `Ret` est de type ` void`). Si `Ret` est de type `jobject`, la valeur renvoyée sera alors un ` 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)

Appelle la méthode statique avec l'methodName sur la classe className, en lui passant les arguments args, et renvoie un nouvel objet QJniObject pour l'objet Java renvoyé.

QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");

La signature de la méthode est déduite lors de la compilation à partir de Ret et des types de args. Ret peut être un type compatible avec std::expected qui renvoie une valeur, ou any Java exception thrown par la méthode appelée.

Cette fonction a été introduite dans Qt 6.4.

[static, since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)

Appelle la méthode statique avec l'methodName e sur clazz, en lui transmettant les arguments args, et renvoie un nouvel objet QJniObject pour l'objet Java renvoyé.

Cette fonction a été introduite dans Qt 6.4.

[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)

Appelle la méthode statique identifiée par ` methodId ` de la classe ` clazz `, avec les arguments qui suivent. Utile lorsque ` clazz ` et ` methodId ` sont déjà mis en cache à la suite d'opérations précédentes.

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

Appelle la méthode statique ` methodName ` de la classe ` className `, en utilisant ` signature ` pour spécifier les types des arguments suivants.

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

Appelle la méthode statique ` methodName ` de la classe ` clazz `, en utilisant ` signature ` pour spécifier les types des arguments suivants.

[since 6.2] QByteArray QJniObject::className() const

Renvoie le nom de l'objet de classe détenu par l'QJniObject, sous la forme d'un objet de type ` QByteArray`.

Cette fonction a été introduite dans Qt 6.2.

[static, since 6.4] template <typename Class, typename... Args> auto QJniObject::construct(Args &&... args)

Crée une instance de la classe Java équivalente à Class et renvoie un QJniObject contenant l'objet JNI. Les arguments de args sont transmis au constructeur Java.

QJniObject javaString = QJniObject::construct<jstring>();

Cette fonction n’est disponible que si tous les args sont connus JNI Types.

Cette fonction a été introduite dans Qt 6.4.

[static] QJniObject QJniObject::fromLocalRef(jobject localRef)

Crée un objet ` QJniObject ` à partir de la référence JNI locale ` localRef`. Cette fonction prend possession de ` localRef ` et le libère avant de retourner.

Remarque : n'appelez cette fonctionqu'avec une référence JNI locale. Par exemple, la plupart des appels JNI bruts, via l'environnement JNI, renvoient des références locales à un objet Java.

jobject localRef = env->GetObjectArrayElement(array, index);
QJniObject element = QJniObject::fromLocalRef(localRef);

[static] QJniObject QJniObject::fromString(const QString &string)

Crée une chaîne Java à partir de l'objet QString string et renvoie un objet QJniObject contenant cette chaîne.

QString myQString = "QString";
QJniObject myJavaString = QJniObject::fromString(myQString);

Voir également toString().

template <typename Type> auto QJniObject::getField(const char *fieldName) const

Récupère la valeur du champ « fieldName ».

QJniObject volumeControl("org/qtproject/qt/TestClass");
jint fieldValue = volumeControl.getField<jint>("FIELD_NAME");

template <typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const

Récupère un objet JNI à partir du champ « fieldName ».

QJniObject field = jniObject.getObjectField<jstring>("FIELD_NAME");

QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const

Récupère un objet JNI à partir du champ « fieldName » avec « signature ».

Remarque : cette fonction peut être utilisée sans type de modèle.

QJniObject field = jniObject.getObjectField("FIELD_NAME", "Ljava/lang/String;");

[static] template <typename Klass, typename T> auto QJniObject::getStaticField(const char *fieldName)

Récupère la valeur du champ statique « fieldName » de la classe « Klass ».

Klass Ce champ doit être de type C++ et disposer d'un mappage de type enregistré vers un type Java.

[static] template <typename Type> auto QJniObject::getStaticField(const char *className, const char *fieldName)

Récupère la valeur du champ statique « fieldName » de la classe « className ».

[static] template <typename Type> auto QJniObject::getStaticField(jclass clazz, const char *fieldName)

Récupère la valeur du champ statique « fieldName » sur clazz.

[static] template <typename T> QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)

Récupère l'objet à partir du champ « fieldName » de la classe « className ».

QJniObject jobj = QJniObject::getStaticObjectField<jstring>("class/with/Fields", "FIELD_NAME");

[static] template <typename T> QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)

Récupère l'objet à partir du champ fieldName sur clazz.

QJniObject jobj = QJniObject::getStaticObjectField<jstring>(clazz, "FIELD_NAME");

[static] QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)

Récupère un objet JNI à partir du champ fieldName avec signature issu de la classe className.

Remarque : cette fonction peut être utilisée sans type de modèle.

QJniObject jobj = QJniObject::getStaticObjectField("class/with/Fields", "FIELD_NAME",
                                                   "Ljava/lang/String;");

[static] QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName, const char *signature)

Récupère un objet JNI à partir du champ « fieldName » avec « signature » de la classe « clazz ».

Remarque : cette fonction peut être utilisée sans type de modèle.

QJniObject jobj = QJniObject::getStaticObjectField(clazz, "FIELD_NAME", "Ljava/lang/String;");

[static] bool QJniObject::isClassAvailable(const char *className)

Renvoie « true » si la classe Java « className » est disponible.

if (QJniObject::isClassAvailable("java/lang/String")) {
    // condition statement
}

bool QJniObject::isValid() const

Renvoie « true » si cette instance contient un objet Java valide.

QJniObject qjniObject;                        // ==> isValid() == false
QJniObject qjniObject(0)                      // ==> isValid() == false
QJniObject qjniObject("could/not/find/Class") // ==> isValid() == false

jobject QJniObject::object() const

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

Renvoie l'objet contenu dans l'QJniObject, soit sous forme de jobject, soit sous la forme du type T. T peut être l'un des éléments suivants : JNI Object Types.

QJniObject string = QJniObject::fromString("Hello, JNI");
jstring jstring = string.object<jstring>();

Remarque : l’objet renvoyé reste en mémoire via cette QJniObject. Pour conserver l’objet au-delà de la durée de vie de cette QJniObject, par exemple pour l’enregistrer en vue d’une utilisation ultérieure, la méthode la plus simple consiste à le stocker dans une autre QJniObject dotée d’une durée de vie appropriée. Vous pouvez également créer une nouvelle référence globale à l’objet et la stocker, en prenant soin de la libérer lorsque vous n’en avez plus besoin.

void functionScope()
{
    QString helloString("Hello");
    jstring myJString = 0;
    {
        QJniObject string = QJniObject::fromString(helloString);
        myJString = string.object<jstring>();
    }

    // Ops! myJString is no longer valid.
    QString myQtString = QJniObject(myJString).toString();
}

[since 6.2] jclass QJniObject::objectClass() const

Renvoie l'objet de classe détenu par l'QJniObject sous la forme d'un jclass.

Remarque : l’objet renvoyé reste en vie grâce à cet « QJniObject ». Pour maintenir l’objet en vie au-delà de la durée de vie de cet « QJniObject », par exemple pour l’enregistrer en vue d’une utilisation ultérieure, la méthode la plus simple consiste à le stocker dans un autre « QJniObject » doté d’une durée de vie appropriée. Vous pouvez également créer une nouvelle référence globale vers l’objet et la stocker, en prenant soin de la libérer lorsque vous n’en avez plus besoin.

Cette fonction a été introduite dans Qt 6.2.

template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, Type value)

Définit la valeur de « fieldName » sur « value ».

QJniObject obj;
obj.setField<jint>("AN_INT_FIELD", 10);
jstring myString = ...;
obj.setField<jstring>("A_STRING_FIELD", myString);

template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, const char *signature, Type value)

Définit la valeur de « fieldName » avec « signature » sur « value ».

QJniObject stringArray = ...;
QJniObject obj = ...;
obj.setObjectField<jobjectArray>("KEY_VALUES", "([Ljava/lang/String;)V",
                           stringArray.object<jobjectArray>())

[static] template < typename Klass, typename Ret = void, typename Type > auto QJniObject::setStaticField(const char *fieldName, Type value)

Définit le champ statique fieldName de la classe Klass sur la valeur value.

Klass Doit être un type C++ dont le mappage de type est enregistré vers un type Java.

[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, Type value)

Définit le champ statique ` fieldName ` de la classe ` className ` sur ` value`.

[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, Type value)

Définit le champ statique ` fieldName ` de la classe ` clazz ` sur ` value`.

[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, Type value)

Définit la propriété statique « fieldName » de la classe « className » sur la valeur « value » à l'aide du setter « signature ».

[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value)

Définit la propriété statique « fieldName » de la classe « clazz » sur la valeur « value » à l'aide du setter « signature ».

[noexcept, since 6.8] void QJniObject::swap(QJniObject &other)

Permute cet objet avec other. Cette opération est très rapide et ne peut jamais échouer.

Cette fonction a été introduite dans Qt 6.8.

QString QJniObject::toString() const

Renvoie un objet ` QString ` contenant la représentation sous forme de chaîne de caractères de l'objet Java. L'appel de cette fonction sur un objet `String` Java constitue un moyen pratique d'obtenir les données réelles de la chaîne.

QJniObject string = ...; //  "Hello Java"
QString qstring = string.toString(); // "Hello Java"

Voir aussi ` fromString()`.

[noexcept default] QJniObject &QJniObject::operator=(QJniObject &&other)

Cette opération attribue l'other à cette instance QJniObject.

template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)

Remplacer l'objet actuel par object. L'ancien objet Java sera libéré.

[noexcept default] QJniObject &QJniObject::operator=(const QJniObject &other)

Copie et attribue other à cette instance de QJniObject.

Éléments non membres associés

bool operator!=(const QJniObject &o1, const QJniObject &o2)

Renvoie « true » si o1 contient une référence à un objet différent de celui de o2.

bool operator==(const QJniObject &o1, const QJniObject &o2)

Renvoie « true » si les deux objets, o1 et o2, font référence au même objet Java, ou si les deux sont NULL. Dans tous les autres cas, la valeur « false » est renvoyée.

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