Auf dieser Seite

QJniArray Class

template <typename T> class QJniArray

Die Klasse „QJniArray“ ist eine Template-Klasse, die ein Array in Java darstellt. Mehr...

Header: #include <QJniArray>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Seit: Qt 6.8
Erbt von: QJniArrayBase

Öffentliche Typen

Öffentliche Funktionen

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

Ausführliche Beschreibung

QJniArray ist eine Vorlagenklasse, bei der „ T “ den Elementtyp des Java-Arrays angibt. Der Typ kann ein JNI-Primitivtyp wie „ jint “ oder „ jbyte “ sein oder ein Objekttyp wie „ jobject “, „ jstring “ oder ein mit „ Q_DECLARE_JNI_CLASS “ deklarierter Typ.

Die Vorlage „QJniArray“ erleichtert die Arbeit mit Java-Methoden, die ein Java-Array zurückgeben oder als Argument entgegennehmen.

Hinweis: Java-Arrays können primitive Typen und Objekte enthalten. Das Array selbst kann wie ein Java-Objekt behandelt werden, und das JNI-Framework stellt explizite APIs für die Arbeit mit solchen Arrays bereit. Darüber hinaus bietet die Java-Klassenbibliothek Containertypen 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 erstellen, konstruieren Sie diese entweder aus einem entsprechenden C++-Container:

QList<int> intList;
const QJniArray intArray = QJniArray(intList);

oder aus einer Initialisierungsliste:

const QJniArray intArray{1, 2, 3};

QJniArray erstellt ein neues Java-Array und kopiert die Daten von der C++-Seite dorthin.

Beim Aufruf von Funktionen, die über ` QJniObject::callMethod` ein Array zurückgeben, wie beispielsweise ` char[] toCharArray() ` in der Java-Klasse ` String `, geben Sie den Rückgabetyp als C-Array an (im folgenden Beispiel `jchar[] `):

const auto charArray = stringObject.callMethod<jchar[]>("toCharArray");

Die Variable ` charArray ` ist vom Typ ` QJniArray<jchar>` und enthält eine neue globale Referenz auf das JNI-Objekt ` jcharArray `.

Beachten Sie, dass die Arrays in den obigen Codeausschnitten alle vom Typ `const` sind. Der Zugriff auf Elemente in einem `const`-Array ist wesentlich effizienter als die Bearbeitung eines veränderbaren Arrays.

Ein `QJniArray` kann auch aus einem bestehenden ` jarray ` oder ` QJniObject` erstellt werden. Beachten Sie jedoch, dass keine Typüberprüfung durchgeführt wird, um sicherzustellen, dass das ` jarray ` oder ` QJniObject ` tatsächlich ein Array darstellt, das Elemente des angegebenen Typs enthält, und dass der Zugriff auf ein nicht übereinstimmendes `QJniArray` zu undefiniertem Verhalten führt.

Auf die Daten in einem `QJniArray` kann entweder elementweise mit ` at()` oder ` operator[]()` zugegriffen oder durch das Array iteriert werden.

for (const auto &value : array)
    process(value);

Um das gesamte Array in einen Qt-Container auf der C++-Seite zu kopieren, verwenden Sie die Funktion ` toContainer()`.

const auto bytes = object.callMethod<jbyte[]>("getBytes");
QByteArray data = bytes.toContainer();

Dies geschieht implizit in

const auto data = object.callMethod<QByteArray>("getBytes");

Der Rückgabetyp von ` toContainer()` hängt vom Typ ab, mit dem `QJniArray` instanziiert wurde. Bei ` QJniArray<T> ` ist dies in der Regel ` QList<T>`, mit folgenden Ausnahmen:

SpezialisierungC++-Typ
QJniArray<jbyte>QByteArray
QJniArray<char>QByteArray
QJniArray<jstring>QStringList
QJniArray<QString>QStringList

Ein Array fester Größe kann auch ohne Daten angelegt werden und anschließend Element für Element mit ` operator[]`

QJniArray<jint> intArray(size);
for (int i = 0; i < size; ++i)
    intArray[i] = i;

oder mit einem veränderbaren 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 Elementtyp „ size_type “ von `QJniArray` ist „ jsize “, ein 32-Bit-Ganzzahltyp. Der Versuch, ein `QJniArray` aus einem C++-Container zu erstellen, der mehr als 2^32 Elemente enthält, führt zu einer Laufzeit-Assertion.

Dokumentation zu Mitgliedstypen

[alias] QJniArray::const_iterator

[alias] QJniArray::iterator

Ein Iterator mit wahlfreiem Zugriff für „ QJniArray “. /*

/*!

Ein Iterator mit wahlfreiem Zugriff und „const“-Eigenschaft für ` QJniArray`.

[alias] QJniArray::const_reverse_iterator

[alias] QJniArray::reverse_iterator

Ein Reverse-Iterator für ` QJniArray`, ein Synonym für ` std::reverse_iterator<iterator>`.

Hinweis: Der Zugriff auf das Element des umgekehrten Iterators mithilfe von ` operator->() ` erfordert C++20, da der C++17-Iterator ` reverse_iterator ` keine Iteratoren unterstützt, die ein Proxy-Objekt zurückgeben. /*

/*!

Ein Reverse-Iterator für den ` QJniArray`, Synonym für ` std::reverse_iterator<const_iterator>`.

Hinweis: Der Zugriff auf das Element des Reverse-Iterators mithilfe von ` operator->() ` erfordert C++20, da die C++17-` reverse_iterator ` keine Iteratoren unterstützt, die ein Proxy-Objekt zurückgeben.

Dokumentation der Mitgliedsfunktionen

[default] QJniArray::QJniArray()

Standardkonstruktor von QJniArray. Dabei wird kein Array auf der Java-Seite erstellt, und die Instanz ist ungültig.

Siehe auch isValid.

[explicit] template <typename Container> requires if_compatible_source_container<Container> QJniArray::QJniArray(Container &&container)

Erstellt ein `QJniArray`, das ein neu erstelltes Java-Array für Elemente vom Typ ` Container::value_type` umschließt, und füllt das Java-Array mit den Daten aus ` container`.

Einschränkungen

Nimmt nur dann an der Überladungsauflösung teil, wenn ` Container ` ein Container ist, der Elemente vom Typ ` JNI type ` oder einem äquivalenten C++-Typ speichert und einen Vorwärtsiterator bereitstellt.

Die Spezialisierung des erstellten `QJniArray` hängt vom Werttyp des ` container` ab. Bei einem ` Container<T> ` (wie z. B. ` QList<T>`) ist dies in der Regel ` QJniArray<T>`, mit folgenden Ausnahmen:

ContainerSpezialisierung
QByteArrayQJniArray<jbyte>
QStringListQJniArray<jstring>
Container::value_typeSpezialisierung
QJniObjectQJniArray<jobject>

Siehe auch QJniArrayBase::fromContainer() und toContainer().

[noexcept] template <typename Other> requires if_convertible<Other, T> QJniArray::QJniArray(QJniArray<Other> &&other)

Erstellt ein `QJniArray`, indem Daten aus ` other` verschoben werden. 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 “ des zu erstellenden QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.

[noexcept delete] template <typename Other> requires unless_convertible<Other, T> QJniArray::QJniArray(QJniArray<Other> &&other)

Erstellt standardmäßig eine Instanz von ` QJniArray`. Diese Funktion wurde gelöscht.

[explicit, since 6.9] QJniArray::QJniArray(QJniArrayBase::size_type size)

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

Erstellt ein `QJniArray`, indem es von ` object` kopiert wird. Aus ` QJniObject ` wird ` invalid`.

Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht übereinstimmendes `QJniArray` führt zu undefiniertem Verhalten.

template <typename Other> requires if_convertible<Other, T> QJniArray::QJniArray(const QJniArray<Other> &other)

Erstellt ein `QJniArray` durch Kopieren von ` other`. Beide `QJniArray`-Objekte verweisen auf dasselbe Java-Array-Objekt.

Einschränkungen

Nimmt nur dann an der Überladungsauflösung teil, wenn der Elementtyp „ Other “ von „ other “ in den Elementtyp „ T “ des zu erstellenden QJniArray konvertierbar ist. Es findet jedoch keine tatsächliche Konvertierung statt.

[delete] template <typename Other> requires unless_convertible<Other, T> QJniArray::QJniArray(const QJniArray<Other> &other)

Erstellt standardmäßig eine Instanz von ` QJniArray`. Diese Funktion wurde gelöscht.

[explicit] QJniArray::QJniArray(const QJniObject &object)

Erstellt ein `QJniArray`, das dasselbe Java-Array wie ` object` umschließt, und erzeugt dabei eine neue globale Referenz. Um ein `QJniArray` aus einer bestehenden lokalen Referenz zu erstellen, verwenden Sie ein ` QJniObject `, das über ` fromLocalRef()` erstellt wurde.

Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht passendes `QJniArray` führt zu undefiniertem Verhalten.

[explicit] QJniArray::QJniArray(jarray array)

Erstellt ein QJniArray, das das Java-seitige Array „ array “ umschließt, und erstellt dabei eine neue globale Referenz auf „ array “.

Hinweis: Dieser Konstruktor führt keine Überprüfung durch, ob das Java-Objekt ein Array des richtigen Typs ist. Der Zugriff auf ein nicht passendes `QJniArray` führt zu undefiniertem Verhalten.

[implicit] QJniArray::QJniArray(std::initializer_list<T> &list)

Erstellt ein `QJniArray`, das ein neu erstelltes Java-Array für Elemente vom Typ ` T` umschließt, und füllt das Java-Array mit den Daten aus ` list`.

Siehe auch ` QJniArrayBase::fromContainer()` und ` toContainer()`.

[default] QJniArray::~QJniArray()

Löscht das „ QJniArray “-Objekt und gibt alle Verweise auf das umschlossene Java-Array frei.

auto QJniArray::arrayObject() const

Gibt das verpackte Java-Objekt als den passenden Typ „ jarray “ zurück, der dem Elementtyp „ T “ dieses „ QJniArray “-Objekts entspricht.

Tjarray-Typ
jbytejbyteArray
jcharjcharArray
......
jobjectjobjectArray
QJniObjectjobjectArray
Q_DECLARE_JNI_CLASSjobjectArray

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 im umschlossenen Java-Array zurück.

i muss eine gültige Indexposition in der Liste sein (d. h. 0 <= i < size()).

Siehe auch ` 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

Gibt einen const-Iterator im STL-Stil zurück, der auf das erste Element des Arrays zeigt.

Ist das Array vom Typ „ invalid “, gibt diese Funktion 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 Element nach dem letzten 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 des Arrays in umgekehrter Reihenfolge verweist.

Ist das Array vom Typ „ invalid “, wird derselbe Iterator zurückgegeben wie bei der entsprechenden Funktion „ rend()“.

Hinweis: Der Zugriff auf das Element des umgekehrten Iterators mithilfe von ` operator->() ` erfordert C++20, da die C++17-Funktion ` reverse_iterator ` keine Iteratoren unterstützt, die ein Proxy-Objekt zurückgeben.

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 Reverse-Iterator im STL-Stil zurück, der in umgekehrter Reihenfolge direkt auf das Element nach dem letzten Element der Liste zeigt.

Hinweis: Der Zugriff auf das Element des umgekehrten Iterators mithilfe von ` operator->() ` erfordert C++20, da die C++17-Funktion ` reverse_iterator ` keine Iteratoren unterstützt, die ein Proxy-Objekt zurückgeben.

Siehe auch ` rbegin()` und ` end()`.

template <typename Container = QJniArrayBase::ToContainerType<T>> requires if_compatible_target_container<T, Container> Container QJniArray::toContainer(Container &&container = {}) const

Gibt einen Container zurück, der mit den Daten des umschlossenen Java-Arrays gefüllt ist.

Wird kein ` container ` angegeben, hängt der Typ des zurückgegebenen Containers vom Elementtyp dieses ` QJniArray` ab. Bei ` QJniArray<T> ` ist dies in der Regel ` QList<T>`, mit folgenden Ausnahmen:

Wenn Sie einen benannten Container (ein L-Wert) an ` container` übergeben, wird dieser Container gefüllt und eine Referenz darauf zurückgegeben. Wenn Sie einen temporären Container (ein 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> requires if_convertible<Other, T> QJniArray<T> &QJniArray::operator=(QJniArray<Other> &&other)

Verschiebt „ other “ in „ QJniArray “ und gibt einen Verweis darauf 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> requires if_convertible<Other, T> QJniArray<T> &QJniArray::operator=(const QJniArray<Other> &other)

Weist „ other “ diesem „ QJniArray “ zu und gibt eine Referenz darauf zurück. Beide „ QJniArray “-Objekte verweisen auf dasselbe 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)

Gibt ein Referenzobjekt für den Wert an der Position i im umschlossenen Java-Array zurück.

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 diesen Wert umgewandelt. Eine Zuweisung an die zurückgegebene Referenz überschreibt den Eintrag im Java-Array. Der Aufruf von mutierenden Member-Funktionen auf dem Objekt verändert jedoch nicht den Eintrag im Array. Um eine Member-Funktion auf das Ergebnis dieses Operators anzuwenden, müssen Sie das Referenzobjekt dereferenzieren:

QJniArray<QString> strings = object.callMethod<QString[]>("getStrings");
if (!strings.isEmpty()) {
    if (!(*array[0]).isEmpty()) {
        // ...
    }
}

Wenn jedoch keine Änderung des Werts im Array selbst beabsichtigt ist, sollten Sie das Array als `const` deklarieren oder stattdessen ` at()` verwenden.

Diese Funktion wurde in Qt 6.9 eingeführt.

Siehe auch ` at()` und ` size()`.

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