Sur cette page

QJniObject Class

Une enveloppe de commodité autour de l'interface native de Java (JNI). Plus d'informations...

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()
(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=(T object)

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 enveloppe une référence à un objet Java, garantissant qu'elle n'est pas collectée et fournissant un accès à la plupart des appels de méthode JNIEnv (member, static) et des champs (setter, getter). Cela permet d'éliminer une grande partie de la " boiler-plate " qui serait normalement nécessaire, avec un accès direct à la JNI, pour chaque opération. Les exceptions lancées par les méthodes Java appelées sont effacées par défaut, mais peuvent également être gérées par l'appelant depuis Qt 6.11.

Remarque : cette API a été conçue et testée pour Android. Elle n'a pas été testée pour d'autres plateformes.

Signatures de méthodes

QJniObject fournit des fonctions de commodité qui utiliseront la signature correcte 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 qui prennent JNI types, et pour les types qui ont é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 de travailler avec des types Java et Android arbitraires dans le code C++, sans avoir à créer explicitement des 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 entièrement qualifiés, par exemple : "java/lang/String".
  • Les signatures de méthodes sont écrites 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 avoir le préfixe [, et les noms de types Object pleinement qualifiés doivent avoir le préfixe L et le 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 modèles de QJniObject pour créer la chaîne de signature implicite, mais nous pouvons également transmettre la chaîne de signature de manière explicite :

// 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 si le premier paramètre du modèle spécifie le type de retour de la fonction Java, la méthode renverra toujours un QJniObject.

Gestion des exceptions Java

Après avoir appelé des fonctions Java susceptibles de lever des exceptions, il est important de vérifier la présence d'une exception, de la gérer et de l'éliminer avant de poursuivre. Toutes les fonctions QJniObject peuvent gérer les exceptions en interne en les signalant et en les supprimant. Cela inclut les exceptions JNI, par exemple lorsqu'on essaie d'appeler une méthode qui n'existe pas, ou avec de mauvais paramètres ; et les exceptions sont lancées par la méthode comme moyen de signaler les erreurs ou de renvoyer des informations sur l'échec.

À partir de Qt 6.11, le code client peut choisir de gérer les exceptions explicitement à chaque appel. Pour ce faire, utilisez std::expected de C++ 23 comme type de retour, avec le type de valeur comme attendu, et jthrowable comme type d'erreur. Par exemple, essayer de lire la valeur d'un paramètre via le type android.provider.Settings.Secure peut générer une exception si le 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 qui se comporte comme std::expected, de sorte que la gestion explicite des exceptions est possible sans utiliser C++23. Les seules exigences 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 valeur et que son unexpected_type contienne un jthrowable.

Remarque : l'utilisateur doit gérer les exceptions manuellement lorsqu'il effectue des appels JNI en utilisant directement JNIEnv. Il n'est pas sûr 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 à partir de Java, en créant une déclaration de fonction en Java et en la faisant précéder du mot-clé native. Avant qu'une fonction native puisse être appelée à partir de Java, vous devez faire correspondre la fonction native Java à une fonction native dans votre code. Le mappage des fonctions peut être effectué en appelant QJniEnvironment::registerNativeMethods().

L'exemple ci-dessous montre comment 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 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 les méthodes natives en premier, 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 rappellera les fonctions C++  QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10) ; // Sortie : 10 < 100  QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100) ; // Sortie : 100 >= 100}

La durée de vie d'un objet Java

La plupart des objects reçus de Java seront des références locales et ne resteront valides que jusqu'à ce que vous reveniez de la méthode native. Après cela, l'objet devient éligible pour le ramassage des ordures. Si votre code crée de nombreuses références locales dans une boucle, vous devez les supprimer manuellement à chaque itération, sinon vous risquez de manquer de mémoire. Pour plus d'informations, voir Vue d'ensemble de la conception de la 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 en raison de l'utilisation de AttachCurrentThread. Pour plus d'informations, voir les astuces 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 à l'objet et la libérer lorsque vous avez terminé, soit construire un nouveau QJniObject et le laisser gérer la durée de vie de l'objet Java.

Remarque : le QJniObject ne gère que ses propres références. Si vous construisez 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

Type d'objetSignature
jobjectLjava/lang/Objet ;
jclassLjava/lang/Classe ;
jstringLjava/lang/String ;
jthrowableLjava/lang/Throwable ;
jobjectArray[Ljava/lang/Objet ;
jarray[<type>
jbooleanArray[Z
jbyteArray[B
jcharArray[C
jshortArray[S
jintArray[I
jlongArray[J
jfloatArray[F
jdoubleArray[D

Types primitifs

Type de tableauSignature
jbooleanZ
jbyteB
jcharC
jshortS
jintI
jlongJ
jfloatF
jdoubleD

Autre

Type de signatureSignature
videV
Type personnaliséL<nom pleinement qualifié>;

Pour plus d'informations sur JNI, voir Java Native Interface Specification.

Voir également QJniEnvironment et object().

Documentation des fonctions membres

QJniObject::QJniObject()

Construit un objet JNI invalide.

Voir aussi isValid().

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

Construit un nouvel objet JNI en appelant le constructeur par défaut de className.

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

[explicit] QJniObject::QJniObject(jclass clazz)

Construit un nouvel objet JNI en appelant le constructeur par défaut de clazz.

Remarque : le 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 du QJniObject doivent être gérées par l'appelant.

QJniObject::QJniObject(jobject object)

Construit un nouvel objet JNI autour de l'objet Java object.

Remarque : le QJniObject conserve une référence à l'objet Java object et la libère lorsqu'il est détruit. 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, à moins que vous n'ayez l'intention de gérer la référence locale vous-même. 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)

Construit un nouvel objet JNI en appelant le constructeur de className avec les arguments args. Ce constructeur n'est disponible que si tous les args sont connus 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)

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

Construit un nouvel objet JNI en appelant le constructeur de className avec signature spécifiant les types des 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, ...)

Construit un nouvel objet JNI à partir de clazz en appelant le constructeur avec signature spécifiant les types des arguments suivants.

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

[noexcept] QJniObject::~QJniObject()

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

[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 void). Si Ret est un type jobject, la valeur renvoyée sera un QJniObject.

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

La signature de la méthode est déduite à 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 de l'objet methodName avec signature spécifiant les types des arguments suivants args, et renvoie la valeur (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera 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 des objets Java methodName avec les arguments args et renvoie un nouveau 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 au moment 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.

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

Appelle la méthode de l'objet Java methodName avec signature spécifiant 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 sur la classe Klass et renvoie la valeur du type Ret (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera QJniObject.

La signature de la méthode est déduite au moment de la compilation à partir de Ret et des types de args. Klass doit être un type C++ avec une correspondance de type enregistrée vers un type Java. 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.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 sur la classe className avec les arguments args, et renvoie la valeur du type Ret (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera QJniObject.

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

La signature de la méthode est déduite à 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 du type Ret (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera 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 à 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 tous les arguments suivants, et renvoie la valeur du type Ret (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera QJniObject.

Utile lorsque clazz et methodId ont déjà été mis en cache lors 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 des arguments suivants args. Renvoie le résultat de la méthode (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera 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 à partir de clazz, signature spécifiant les types des arguments suivants. Renvoie le résultat de la méthode (sauf si Ret est void). Si Ret est un type jobject, la valeur renvoyée sera 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 methodName sur la classe className, en passant des arguments args, et renvoie un nouveau QJniObject pour l'objet Java renvoyé.

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

La signature de la méthode est déduite au moment 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 methodName sur clazz, en passant les arguments args, et renvoie un nouveau 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 tous les arguments suivants. Utile lorsque clazz et methodId ont déjà été mis en cache lors 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 à partir de la classe className, signature spécifiant 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, signature spécifiant les types des arguments suivants.

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

Renvoie le nom de l'objet de classe détenu par QJniObject en tant que QByteArray.

Cette fonction a été introduite dans Qt 6.2.

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

Construit une instance de la classe Java qui est l'équivalent de 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 QJniObject à partir de la référence JNI locale localRef. Cette fonction prend possession de localRef et le libère avant de revenir.

Remarque : n'appelez cette fonction qu'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 QString string et renvoie une QJniObject contenant cette chaîne.

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

Voir aussi 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 du champ fieldName avec signature.

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

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 pour la classe Klass.

Klass Le champ statique doit être un type C++ avec une correspondance enregistrée avec 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 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 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 du champ fieldName avec signature de la classe className.

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

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 du champ fieldName avec signature de la classe clazz.

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

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

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

Retourne vrai si la classe Java className est disponible.

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

bool QJniObject::isValid() const

Retourne 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 détenu par QJniObject, soit sous forme de jobject, soit sous forme de type T. T peut être l'un des types suivants : JNI Object Types.

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

Remarque : l'objet renvoyé est toujours maintenu en vie par le site QJniObject. Pour maintenir l'objet en vie au-delà de la durée de vie de ce site QJniObject, par exemple pour l'enregistrer en vue d'une utilisation ultérieure, l'approche la plus simple consiste à le stocker dans un autre site QJniObject avec 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 QJniObject en tant que jclass.

Remarque : l'objet renvoyé est toujours maintenu en vie par ce site QJniObject. Pour maintenir l'objet en vie au-delà de la durée de vie de ce QJniObject, par exemple pour l'enregistrer en vue d'une utilisation ultérieure, l'approche la plus simple consiste à le stocker dans un autre QJniObject avec 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.

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 à 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 à 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 à value.

Klass doit être un type C++ avec une correspondance de type enregistrée 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 à 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 à value.

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

Définit le champ statique fieldName de la classe className à value en utilisant le setter avec signature.

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

Définit le champ statique fieldName de la classe clazz à value en utilisant le setter avec signature.

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

Échange cet objet avec other. Cette opération est très rapide et n'échoue jamais.

Cette fonction a été introduite dans Qt 6.8.

QString QJniObject::toString() const

Renvoie une adresse QString contenant une représentation sous forme de chaîne de l'objet Java. L'appel de cette fonction sur un objet Java String est 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 également fromString().

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

Non-membres apparentés

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

Retourne vrai si o1 contient une référence à un objet différent de o2.

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

Retourne 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, false est renvoyé.

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