QJniArray Class
template <typename T> class QJniArrayLa classe QJniArray est une classe de modèle qui représente un tableau en Java. En savoir plus...
| En-tête : | #include <QJniArray> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Depuis : | Qt 6.8 |
| Hérite de : | QJniArrayBase |
Types publics
Fonctions publiques
| QJniArray() | |
| QJniArray(Container &&container) | |
| QJniArray(QJniArray<Other> &&other) | |
| QJniArray(QJniArray<Other> &&other) | |
(since 6.9) | QJniArray(QJniArrayBase::size_type size) |
| QJniArray(QJniObject &&object) | |
| QJniArray(const QJniArray<Other> &other) | |
| QJniArray(const QJniArray<Other> &other) | |
| QJniArray(const QJniObject &object) | |
| QJniArray(jarray array) | |
| QJniArray(std::initializer_list<T> &list) | |
| ~QJniArray() | |
| auto | arrayObject() const |
| QJniArray<T>::const_reference | at(QJniArrayBase::size_type i) const |
| QJniArray<T>::iterator | begin() |
| QJniArray<T>::const_iterator | begin() const |
| QJniArray<T>::const_iterator | cbegin() const |
| QJniArray<T>::const_iterator | cend() const |
| QJniArray<T>::const_iterator | constBegin() const |
| QJniArray<T>::const_iterator | constEnd() const |
| QJniArray<T>::const_reverse_iterator | crbegin() const |
| QJniArray<T>::const_reverse_iterator | crend() const |
| QJniArray<T>::iterator | end() |
| QJniArray<T>::const_iterator | end() const |
| QJniArray<T>::reverse_iterator | rbegin() |
| QJniArray<T>::const_reverse_iterator | rbegin() const |
| QJniArray<T>::reverse_iterator | rend() |
| QJniArray<T>::const_reverse_iterator | rend() const |
| Container | toContainer(Container &&container = {}) const |
| QJniArray<T> & | operator=(QJniArray<Other> &&other) |
| QJniArray<T> & | operator=(const QJniArray<Other> &other) |
(since 6.9) QJniArray<T>::reference | operator[](QJniArrayBase::size_type i) |
| QJniArray<T>::const_reference | operator[](QJniArrayBase::size_type i) const |
Description détaillée
QJniArray est une classe de modèle dans laquelle T spécifie le type d'élément du tableau Java. Le type peut être un type primitif JNI tel que jint ou jbyte, ou un type objet tel que jobject, jstring, ou encore un type déclaré avec Q_DECLARE_JNI_CLASS.
Le modèle QJniArray facilite l'utilisation des méthodes Java qui renvoient ou prennent un tableau Java.
Remarque : les tableaux Java peuvent contenir des types primitifs et des objets. Le tableau lui-même peut être traité comme un objet Java, et le framework JNI fournit des API explicites pour manipuler de tels tableaux. De plus, la bibliothèque de classes Java fournit des types de conteneurs tels que List ou ArrayList. Les objets de ces types ne peuvent pas être représentés par un QJniArray. Utilisez plutôt QJniObject pour appeler les fonctions membres spécifiques à la classe.
Pour créer une instance de QJniArray, vous pouvez soit la construire à partir d’un conteneur C++ correspondant :
soit à partir d’une liste d’initialisation :
const QJniArray intArray{1, 2, 3};QJniArray créera un nouveau tableau Java et y copiera les données du côté C++.
Lorsque vous appelez des fonctions qui renvoient un tableau via QJniObject::callMethod, telles que char[] toCharArray() dans la classe Java String, spécifiez le type de retour comme un tableau C (jchar[] dans l’exemple suivant) :
const auto charArray = stringObject.callMethod<jchar[]>("toCharArray");La variable ` charArray ` sera de type ` QJniArray<jchar>` et contiendra une nouvelle référence globale à l’objet JNI ` jcharArray `.
Notez que les tableaux dans les extraits de code ci-dessus sont tous de type const. L'accès aux éléments d'un tableau const est nettement plus efficace que les opérations sur un tableau mutable.
Un `QJniArray` peut également être construit à partir d’un ` jarray ` ou d’un ` QJniObject` existant. Notez toutefois qu’aucune vérification de type n’est effectuée pour s’assurer que ` jarray ` ou ` QJniObject ` représente bien un tableau contenant des éléments du type spécifié, et que l’accès à un `QJniArray` non compatible entraîne un comportement indéfini.
Les données d’un QJniArray sont accessibles soit élément par élément à l’aide de ` at()` ou ` operator[]()`, soit par itération.
for (const auto &value : array)
process(value);Pour copier l’ensemble du tableau dans un conteneur Qt côté C++, utilisez la fonction toContainer().
const auto bytes = object.callMethod<jbyte[]>("getBytes");
QByteArray data = bytes.toContainer();Ce qui se produit implicitement dans
const auto data = object.callMethod<QByteArray>("getBytes");Le type de retour de ` toContainer()` dépend du type avec lequel `QJniArray` a été instancié. Pour ` QJniArray<T> `, il s’agit généralement de ` QList<T>`, à l’exception des cas suivants :
| Spécialisation | Type C++ |
|---|---|
| QJniArray<jbyte> | QByteArray |
| QJniArray<char> | QByteArray |
| QJniArray<jstring> | QStringList |
| QJniArray<QString> | QStringList |
Un tableau de taille fixe peut également être créé sans aucune donnée, puis rempli élément par élément à l'aide de ` operator[]` :
QJniArray<jint> intArray(size);
for (int i = 0; i < size; ++i)
intArray[i] = i;ou un itérateur modifiable :
QJniArray<QString> strings(size);
int i = 0;
for (auto string : strings) // note: not 'auto &string'
string = u"Row %1"_s.arg(i++);Comme en Java, la taille d’un tableau ne peut pas être modifiée, mais la variable de type tableau peut être assignée à un autre tableau.
Remarque : les tableauxJava sont limités à 32 bits, et le type de membre size_type de QJniArray est jsize, qui est un type entier de 32 bits. Tenter de construire un QJniArray à partir d'un conteneur C++ contenant plus de 2^32 éléments provoquera une assertion à l'exécution.
Documentation sur les types de membres
Un itérateur à accès aléatoire pour QJniArray. /*
/*!
Un itérateur const à accès aléatoire pour QJniArray.
Un itérateur inversé pour ` QJniArray`, synonyme de ` std::reverse_iterator<iterator>`.
Remarque : l'accès à l'élément de l'itérateur inversé à l'aide de ` operator->() ` nécessite C++20, car la fonction ` reverse_iterator ` de C++17 ne prend pas en charge les itérateurs qui renvoient un objet proxy. /*
/*!
Un itérateur inverse pour le QJniArray, synonyme de std::reverse_iterator<const_iterator>.
Remarque : l'accès à l'élément de l'itérateur inversé à l'aide de ` operator->() ` nécessite C++20, car l'itérateur ` reverse_iterator ` de C++17 ne prend pas en charge les itérateurs renvoyant un objet proxy.
Documentation des fonctions membres
[default] QJniArray::QJniArray()
Constructeur par défaut de QJniArray. Cela ne crée pas de tableau côté Java, et l'instance sera invalide.
Voir également isValid.
[explicit] template <typename Container> requires if_compatible_source_container<Container> QJniArray::QJniArray(Container &&container)
Crée un objet `QJniArray` qui encapsule un tableau Java nouvellement créé contenant des éléments de type ` Container::value_type`, et remplit ce tableau Java avec les données provenant de ` container`.
Contraintes
Ne participe à la résolution des surcharges que si ` Container ` est un conteneur stockant des éléments de type ` JNI type ` ou d’un type C++ équivalent, et fournissant un itérateur avant.
La spécialisation du QJniArray construit dépend du type de valeur de container. Pour un Container<T> (tel que, par exemple, QList<T>), il s’agira généralement de QJniArray<T>, avec les exceptions suivantes :
| Conteneur | Spécialisation |
|---|---|
| QByteArray | QJniArray<jbyte> |
| QStringList | QJniArray<jstring> |
| Container::value_type | Spécialisation |
| QJniObject | QJniArray<jobject> |
Voir également QJniArrayBase::fromContainer() et toContainer().
[noexcept] template <typename Other> requires if_convertible<Other, T> QJniArray::QJniArray(QJniArray<Other> &&other)
Crée un objet `QJniArray` à partir de ` other`. Le tableau ` other ` devient ` invalid`.
Contraintes
Ne participe à la résolution des surcharges que si le type d’élément Other de other est convertible vers le type d’élément T du QJniArray en cours de construction. Cependant, aucune conversion n’a lieu concrètement.
[noexcept delete] template <typename Other> requires unless_convertible<Other, T> QJniArray::QJniArray(QJniArray<Other> &&other)
Construit par défaut une instance de ` QJniArray`. Cette fonction est supprimée.
[explicit, since 6.9] QJniArray::QJniArray(QJniArrayBase::size_type size)
Crée un QJniArray vide de taille size. Les éléments du tableau ne sont pas initialisés.
Cette fonction a été introduite dans Qt 6.9.
[explicit noexcept] QJniArray::QJniArray(QJniObject &&object)
Construit un QJniArray à partir de object. L'QJniObject devient invalid.
Remarque : ce constructeur ne vérifie pas si l'objet côté Java est bien un tableau du type approprié. L'accès à un QJniArray dont le type ne correspond pas entraîne un comportement indéfini.
template <typename Other> requires if_convertible<Other, T> QJniArray::QJniArray(const QJniArray<Other> &other)
Crée un objet `QJniArray` en copiant ` other`. Les deux objets `QJniArray` feront référence au même objet de tableau Java.
Contraintes
Ne participe à la résolution des surcharges que si le type d’élément Other de other est convertible vers le type d’élément T du QJniArray en cours de construction. Cependant, aucune conversion n’a lieu concrètement.
[delete] template <typename Other> requires unless_convertible<Other, T> QJniArray::QJniArray(const QJniArray<Other> &other)
Construit par défaut une instance de ` QJniArray`. Cette fonction est supprimée.
[explicit] QJniArray::QJniArray(const QJniObject &object)
Construit un QJniArray qui encapsule le même tableau Java que object, en créant une nouvelle référence globale. Pour construire un QJniArray à partir d'une référence locale existante, utilisez un QJniObject construit via fromLocalRef().
Remarque : ce constructeur ne vérifie pas si l’objet côté Java est bien un tableau du type approprié. L’accès à un `QJniArray` non compatible entraîne un comportement indéfini.
[explicit] QJniArray::QJniArray(jarray array)
Construit un objet `QJniArray` qui encapsule le tableau côté Java ` array`, en créant une nouvelle référence globale à ` array`.
Remarque : ce constructeur ne vérifie pas si l'objet côté Java est bien un tableau du type approprié. L'accès à un `QJniArray` dont le type ne correspond pas entraîne un comportement indéfini.
[implicit] QJniArray::QJniArray(std::initializer_list<T> &list)
Crée un objet `QJniArray` qui encapsule un tableau Java nouvellement créé contenant des éléments de type ` T`, et remplit ce tableau Java avec les données provenant de ` list`.
Voir également QJniArrayBase::fromContainer() et toContainer().
[default] QJniArray::~QJniArray()
Détruit l'objet ` QJniArray ` et libère toutes les références pointant vers le tableau Java encapsulé.
auto QJniArray::arrayObject() const
Renvoie l'objet Java encapsulé sous la forme du type « jarray » correspondant au type d'élément T de cet objet QJniArray.
| T | type jarray |
|---|---|
| jbyte | jbyteArray |
| jchar | jcharArray |
| ... | ... |
| jobject | jobjectArray |
| QJniObject | jobjectArray |
| Q_DECLARE_JNI_CLASS | jobjectArray |
QJniArray<T>::const_reference QJniArray::at(QJniArrayBase::size_type i) const
QJniArray<T>::const_reference QJniArray::operator[](QJniArrayBase::size_type i) const
Renvoie la valeur située à la position i dans le tableau Java encapsulé.
i i doit être un indice valide dans la liste (c'est-à-dire 0 <= < ()). size
Voir également ` size()`.
[noexcept] QJniArray<T>::iterator QJniArray::begin()
[noexcept] QJniArray<T>::const_iterator QJniArray::cbegin() const
[noexcept] QJniArray<T>::const_iterator QJniArray::constBegin() const
[noexcept] QJniArray<T>::const_iterator QJniArray::begin() const
Renvoie un itérateur `const` de type STL pointant vers le premier élément du tableau.
Si le tableau est de type « invalid », cette fonction renvoie le même itérateur que la fonction correspondante « end() ».
Voir également ` end()` et ` rbegin()`.
[noexcept] QJniArray<T>::iterator QJniArray::end()
[noexcept] QJniArray<T>::const_iterator QJniArray::cend() const
[noexcept] QJniArray<T>::const_iterator QJniArray::constEnd() const
[noexcept] QJniArray<T>::const_iterator QJniArray::end() const
Renvoie un itérateur de type STL pointant juste après le dernier élément de la liste.
Voir également begin() et rend().
[noexcept] QJniArray<T>::reverse_iterator QJniArray::rbegin()
[noexcept] QJniArray<T>::const_reverse_iterator QJniArray::crbegin() const
[noexcept] QJniArray<T>::const_reverse_iterator QJniArray::rbegin() const
Renvoie un itérateur inversé de type STL pointant vers le premier élément du tableau, dans l'ordre inverse.
Si le tableau est de type ` invalid`, cette méthode renvoie le même itérateur que la fonction correspondante ` rend()`.
Remarque : l'accès à l'élément de l'itérateur inversé à l'aide de ` operator->() ` nécessite C++20, car la fonction ` reverse_iterator ` de C++17 ne prend pas en charge les itérateurs qui renvoient un objet proxy.
Voir également ` rend()` et ` begin()`.
[noexcept] QJniArray<T>::reverse_iterator QJniArray::rend()
[noexcept] QJniArray<T>::const_reverse_iterator QJniArray::crend() const
[noexcept] QJniArray<T>::const_reverse_iterator QJniArray::rend() const
Renvoie un itérateur inversé de type STL pointant juste après le dernier élément de la liste, dans l'ordre inverse.
Remarque : l'accès à l'élément de l'itérateur inversé à l'aide de ` operator->() ` nécessite C++20, car la fonction ` reverse_iterator ` de C++17 ne prend pas en charge les itérateurs qui renvoient un objet proxy.
Voir également ` rbegin()` et ` end()`.
template <typename Container = QJniArrayBase::ToContainerType<T>> requires if_compatible_target_container<T, Container> Container QJniArray::toContainer(Container &&container = {}) const
Renvoie un conteneur rempli avec les données du tableau Java encapsulé.
Si aucun container n’est fourni, le type du conteneur renvoyé dépend alors du type d’élément de cette QJniArray. Pour QJniArray<T>, il s’agira généralement de QList<T>, avec les exceptions suivantes :
| Spécialisation | Type C++ |
|---|---|
| QJniArray<jbyte> | QByteArray |
| QJniArray<char> | QByteArray |
| QJniArray<jstring> | QStringList |
| QJniArray<QString> | QStringList |
Si vous passez un conteneur nommé (une l-valeur) à la fonction ` container`, ce conteneur est rempli et une référence à celui-ci est renvoyée. Si vous passez un conteneur temporaire (une r-valeur, y compris l’argument par défaut), ce conteneur est rempli et renvoyé par valeur.
Cette fonction retourne immédiatement si le tableau est de type ` invalid`.
Voir également ` QJniArrayBase::fromContainer()`.
[noexcept] template <typename Other> requires if_convertible<Other, T> QJniArray<T> &QJniArray::operator=(QJniArray<Other> &&other)
Déplace ` other ` vers ` QJniArray` et renvoie une référence à ce dernier. Le tableau ` other ` devient ` invalid`.
Contraintes
Ne participe à la résolution des surcharges que si le type d’élément Other de other est convertible vers le type d’élément T de cet objet QJniArray. Toutefois, aucune conversion n’a lieu.
template <typename Other> requires if_convertible<Other, T> QJniArray<T> &QJniArray::operator=(const QJniArray<Other> &other)
Attribue la valeur « other » à cet objet « QJniArray » et renvoie une référence à celui-ci. Les deux objets « QJniArray » feront référence au même objet tableau Java.
Contraintes
Ne participe à la résolution des surcharges que si le type d’élément Other de other est convertible vers le type d’élément T de cet objet QJniArray. Toutefois, aucune conversion n’a lieu en réalité.
[since 6.9] QJniArray<T>::reference QJniArray::operator[](QJniArrayBase::size_type i)
Renvoie un objet de référence correspondant à la valeur située à l'indice i dans le tableau Java encapsulé.
i i doit être un indice valide dans la liste (c'est-à-dire 0 <= < ()). size
L’objet de référence renvoyé contient la valeur située à la position i et, dans la plupart des cas, sera implicitement converti en cette valeur. L’affectation à la référence renvoyée écrasera l’élément du tableau Java. Cependant, l’appel de fonctions membres mutantes sur l’objet ne modifiera pas l’élément du tableau. Pour appeler une fonction membre sur le résultat de cet opérateur, déréférencez l’objet de référence :
QJniArray<QString> strings = object.callMethod<QString[]>("getStrings");
if (!strings.isEmpty()) {
if (!(*array[0]).isEmpty()) {
// ...
}
}Toutefois, si vous ne souhaitez pas modifier la valeur dans le tableau lui-même, déclarez le tableau comme `const` ou utilisez plutôt ` at()` à la place.
Cette fonction a été introduite dans Qt 6.9.
© 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.