QJniArray Class
template <typename T> class QJniArrayDie Klasse QJniArray ist eine Vorlagenklasse, die ein Array in Java darstellt. Mehr...
Kopfzeile: | #include <QJniArray> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Seit: | Qt 6.8 |
Vererbt: | QJniArrayBase |
Öffentliche Typen
Öffentliche Funktionen
QJniArray() | |
QJniArray(Container &&container) | |
QJniArray(QJniArray<Other> &&other) | |
(since 6.9) | QJniArray(QJniArrayBase::size_type size) |
QJniArray(QJniObject &&object) | |
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 |
Detaillierte Beschreibung
Die QJniArray-Vorlage erleichtert die Arbeit mit Java-Methoden, die ein Java-Array zurückgeben oder aufnehmen.
Hinweis: Java-Arrays können primitive Typen und Objekte enthalten. Das Array selbst kann wie ein Java-Objekt behandelt werden, und das JNI-Framework bietet explizite APIs für die Arbeit mit solchen Arrays. Darüber hinaus bietet die Java-Klassenbibliothek Container-Typen wie List
oder ArrayList
. Objekte dieser Typen können nicht durch ein QJniArray dargestellt werden. Verwenden Sie stattdessen QJniObject, um die klassenspezifischen Mitgliedsfunktionen aufzurufen.
Um eine QJniArray-Instanz zu erzeugen, konstruieren Sie sie entweder aus einem entsprechenden C++-Container:
oder aus einer Initialisierungsliste:
const QJniArray intArray{1, 2, 3};
QJniArray erstellt ein neues Java-Array und kopiert die C++-seitigen Daten in dieses Array.
Beim Aufruf von Funktionen, die ein Array über QJniObject::callMethod zurückgeben, wie z.B. char[] toCharArray()
in der Java-Klasse String
, geben Sie den Rückgabetyp als C-Array an (im Folgendenjchar[]
):
const auto charArray = stringObject.callMethod<jchar[]>("toCharArray");
Die Variable charArray
wird vom Typ QJniArray<jchar>
sein und einen neuen globalen Verweis auf das JNI-Objekt jcharArray
enthalten.
Beachten Sie, dass die Arrays in den obigen Codeschnipseln alle const sind. Der Zugriff auf Elemente in einem const-Array ist wesentlich effizienter als der Zugriff auf ein veränderbares Array.
Ein QJniArray kann auch aus einem bestehenden jarray
oder QJniObject konstruiert werden. Beachten Sie jedoch, dass keine Typüberprüfung durchgeführt wird, um zu überprüfen, ob jarray
oder QJniObject tatsächlich ein Array mit Elementen des angegebenen Typs darstellt, und der Zugriff auf ein nicht passendes QJniArray führt zu undefiniertem Verhalten.
Auf die Daten in einem QJniArray kann entweder Element für Element mit at() oder operator[]() zugegriffen werden, oder es kann darüber iteriert werden.
for (const auto &value : array) process(value);
Um das gesamte Array in einen C++-seitigen Qt-Container zu kopieren, verwenden Sie die Funktion toContainer().
const auto bytes = object.callMethod<jbyte[]>("getBytes"); QByteArray data = bytes.toContainer();
was implizit geschieht in
const auto data = object.callMethod<QByteArray>("getBytes");
Der Rückgabetyp von toContainer() hängt von dem Typ ab, mit dem QJniArray instanziert wurde. Für QJniArray<T>
ist dies typischerweise QList<T>
, mit den folgenden Ausnahmen:
Spezialisierung | C++-Typ |
---|---|
QJniArray<jbyte> | QByteArray |
QJniArray<char> | QByteArray |
QJniArray<jstring> | QStringList |
QJniArray<QString> | QStringList |
Ein Array mit fester Größe kann auch ohne Daten erstellt werden und kann dann Element für Element mit operator[] aufgefüllt werden:
QJniArray<jint> intArray(size); for (int i = 0; i < size; ++i) intArray[i] = i;
oder einen veränderlichen Iterator:
QJniArray<QString> strings(size); int i = 0; for (auto string : strings) // note: not 'auto &string' string = u"Row %1"_s.arg(i++);
Wie in Java kann die Größe eines Arrays nicht geändert werden, aber die Array-Variable kann einem anderen Array zugewiesen werden.
Hinweis: Java-Arrays sind auf 32 Bit begrenzt, und der size_type
Member-Typ von QJniArray ist jsize
, der ein 32-Bit-Integer-Typ ist. Der Versuch, ein QJniArray aus einem C++ Container zu konstruieren, der mehr als 2^32 Elemente enthält, führt zu einer Laufzeitbehauptung.
Dokumentation der Mitgliedstypen
[alias]
QJniArray::const_iterator
Ein Zufallszugriffs-Iterator für QJniArray.
[alias]
QJniArray::const_reverse_iterator
Ein umgekehrter Iterator für die QJniArray, Synonym für std::reverse_iterator<const_iterator>
.
Dokumentation der Mitgliedsfunktionen
[noexcept]
QJniArray<T>::iterator QJniArray::begin()
[noexcept]
QJniArray<T>::const_iterator QJniArray::begin() const
[noexcept]
QJniArray<T>::const_iterator QJniArray::cbegin() const
[noexcept]
QJniArray<T>::const_iterator QJniArray::constBegin() const
Gibt einen konstanten Iterator im STL-Stil zurück, der auf das erste Element im Array zeigt.
Wenn das Array invalid ist, gibt dies denselben Iterator zurück wie die entsprechende Funktion end().
Siehe auch end() und 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
Gibt einen Iterator im STL-Stil zurück, der direkt auf das letzte Element der Liste zeigt.
Siehe auch begin() und 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
Gibt einen Reverse-Iterator im STL-Stil zurück, der auf das erste Element im Array in umgekehrter Reihenfolge zeigt.
Wenn das Array invalid ist, gibt dies denselben Iterator zurück wie die entsprechende Funktion rend().
Siehe auch rend() und 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
Gibt einen umgekehrten Iterator im STL-Stil zurück, der in umgekehrter Reihenfolge direkt auf das letzte Element der Liste zeigt.
Siehe auch rbegin() und end().
QJniArray<T>::const_reference QJniArray::at(QJniArrayBase::size_type i) const
QJniArray<T>::const_reference QJniArray::operator[](QJniArrayBase::size_type i) const
Gibt den Wert an der Position i in dem umschlossenen Java-Array zurück.
i muss eine gültige Indexposition in der Liste sein (d.h. 0 <= i < size()).
Siehe auch size().
QJniArray::QJniArray()
Standard-Konstruktor von QJniArray. Dies erzeugt kein Java-seitiges Array, und die Instanz ist ungültig.
Siehe auch isValid.
[explicit]
template <typename Container, QJniArrayBase::if_compatible_source_container<Container> = true> QJniArray::QJniArray(Container &&container)
Konstruiert ein QJniArray, das ein neu erstelltes Java-Array für Elemente des Typs Container::value_type
umhüllt, und füllt das Java-Array mit den Daten von container.
Einschränkungen
Nimmt nur an der Überladungsauflösung teil, wenn Container
ein Container ist, der Elemente eines JNI type oder eines äquivalenten C++-Typs speichert und einen Vorwärts-Iterator bereitstellt.
Die Spezialisierung des konstruierten QJniArray hängt vom Wertetyp des container ab. Für ein Container<T>
(wie z.B. QList<T>
) wird es typischerweise QJniArray<T>
sein, mit den folgenden Ausnahmen:
Container | Spezialisierung |
---|---|
QByteArray | QJniArray<jbyte> |
QStringList | QJniArray<jstring> |
Container::Wert_Typ | Spezialisierung |
QJniObject | QJniArray<jobject> |
Siehe auch QJniArrayBase::fromContainer() und toContainer().
[noexcept]
template <typename Other, QJniArrayBase::if_convertible<Other, T> = true> QJniArray::QJniArray(QJniArray<Other> &&other)
Konstruiert ein QJniArray durch Verschieben von other. Das Array other wird zu invalid.
Einschränkungen
Nimmt nur dann an der Überlastauflösung teil, wenn der Elementtyp Other
von other in den Elementtyp T
des zu konstruierenden QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.
[explicit, since 6.9]
QJniArray::QJniArray(QJniArrayBase::size_type size)
Konstruiert ein leeres QJniArray der Größe size. Die Elemente im Array werden nicht initialisiert.
Diese Funktion wurde in Qt 6.9 eingeführt.
[explicit noexcept]
QJniArray::QJniArray(QJniObject &&object)
Konstruiert ein QJniArray, indem er von object ausgeht. QJniObject wird zu invalid.
Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-seitige Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht passendes QJniArray führt zu undefiniertem Verhalten.
template <typename Other, QJniArrayBase::if_convertible<Other, T> = true> QJniArray::QJniArray(const QJniArray<Other> &other)
Konstruiert ein QJniArray durch Kopieren von other. Beide QJniArray-Objekte verweisen auf das gleiche Java-Array-Objekt.
Einschränkungen
Nimmt nur an der Überladungsauflösung teil, wenn der Elementtyp Other
von other in den Elementtyp T
des zu konstruierenden QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.
[explicit]
QJniArray::QJniArray(const QJniObject &object)
Konstruiert ein QJniArray, das dasselbe Java-Array wie object umhüllt und eine neue globale Referenz erzeugt. Um ein QJniArray aus einer bestehenden lokalen Referenz zu konstruieren, verwenden Sie ein QJniObject, das über fromLocalRef() konstruiert wird.
Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-seitige Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht passendes QJniArray führt zu undefiniertem Verhalten.
[explicit]
QJniArray::QJniArray(jarray array)
Konstruiert ein QJniArray, das das Java-seitige Array array umhüllt und eine neue globale Referenz auf array erzeugt.
Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-seitige Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht übereinstimmendes QJniArray führt zu undefiniertem Verhalten.
[default]
QJniArray::QJniArray(std::initializer_list<T> &list)
Konstruiert ein QJniArray, das ein neu erstelltes Java-Array für Elemente vom Typ T
umhüllt, und füllt das Java-Array mit den Daten von list.
Siehe auch QJniArrayBase::fromContainer() und toContainer().
QJniArray::~QJniArray()
Zerstört das Objekt QJniArray und gibt alle Verweise auf das gewickelte Java-Array frei.
auto QJniArray::arrayObject() const
Gibt das gewrappte Java-Objekt als passenden jarray
Typ zurück, der dem Elementtyp T
dieses QJniArray Objekts entspricht.
T | jarray-Typ |
---|---|
jbyte | jbyteArray |
jchar | jcharArray |
... | ... |
jobject | jobjectArray |
QJniObject | jobjectArray |
Q_DECLARE_JNI_CLASS | jobjectArray |
template <typename Container = QJniArrayBase::ToContainerType<T>, QJniArrayBase::if_compatible_target_container<T, Container> = true> Container QJniArray::toContainer(Container &&container = {}) const
Gibt einen Container zurück, der mit den Daten im umschlossenen Java-Array gefüllt ist.
Wenn kein container angegeben wird, hängt der Typ des zurückgegebenen Containers vom Elementtyp dieses QJniArray ab. Für QJniArray<T>
ist dies in der Regel QList<T>
, mit den folgenden Ausnahmen:
Spezialisierung | C++-Typ |
---|---|
QJniArray<jbyte> | QByteArray |
QJniArray<char> | QByteArray |
QJniArray<jstring> | QStringList |
QJniArray<QString> | QStringList |
Wenn Sie einen benannten Container (einen l-Wert) für container übergeben, wird dieser Container gefüllt und ein Verweis auf ihn zurückgegeben. Wenn Sie einen temporären Container (einen r-Wert, einschließlich des Standardarguments) übergeben, wird dieser Container gefüllt und als Wert zurückgegeben.
Diese Funktion kehrt sofort zurück, wenn das Array invalid ist.
Siehe auch QJniArrayBase::fromContainer().
[noexcept]
template <typename Other, QJniArrayBase::if_convertible<Other, T> = true> QJniArray<T> &QJniArray::operator=(QJniArray<Other> &&other)
Verschiebt other in dieses QJniArray und gibt einen Verweis auf dieses zurück. Das Array other wird zu invalid.
Einschränkungen
Nimmt nur dann an der Überladungsauflösung teil, wenn der Elementtyp Other
von other in den Elementtyp T
von diesem QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.
template <typename Other, QJniArrayBase::if_convertible<Other, T> = true> QJniArray<T> &QJniArray::operator=(const QJniArray<Other> &other)
Weist other diesem QJniArray zu und gibt einen Verweis auf dieses zurück. Beide QJniArray Objekte verweisen auf das gleiche Java-Array-Objekt.
Einschränkungen
Nimmt nur dann an der Überladungsauflösung teil, wenn der Elementtyp Other
von other in den Elementtyp T
von diesem QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.
[since 6.9]
QJniArray<T>::reference QJniArray::operator[](QJniArrayBase::size_type i)
Liefert ein Referenzobjekt für den Wert an der Position i in dem umschlossenen Java-Array.
i muss eine gültige Indexposition in der Liste sein (d.h. 0 <= i < size()).
Das zurückgegebene Referenzobjekt enthält den Wert an der Position i und wird in den meisten Fällen implizit in den Wert konvertiert. Die Zuweisung an die zurückgegebene Referenz überschreibt den Eintrag im Java-Array. Allerdings wird der Eintrag im Array durch den Aufruf von Mutating Member Functions auf das Objekt nicht verändert. Um eine Mitgliedsfunktion mit dem Ergebnis dieses Operators aufzurufen, dereferenzieren Sie das Referenzobjekt:
QJniArray<QString> strings = object.callMethod<QString[]>("getStrings"); if (!strings.isEmpty()) { if (!(*array[0]).isEmpty()) { // ... } }
Wenn jedoch der Wert im Array selbst nicht geändert werden soll, machen Sie das Array konstant oder verwenden Sie stattdessen at().
Diese Funktion wurde in Qt 6.9 eingeführt.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.