本页内容

QJniArray Class

template <typename T> class QJniArray

QJniArray 类是一个模板类,用于表示 Java 中的数组。更多内容...

头文件: #include <QJniArray>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
自: Qt 6.8
继承自: QJniArrayBase

公共类型

公共函数

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

详细描述

QJniArray 是一个模板类,其中 `T ` 指定了 Java 数组的元素类型。该类型可以是 JNI 基本类型(如 `jint ` 或 `jbyte`),也可以是对象类型(如 `jobject`、`jstring`),或者使用 `Q_DECLARE_JNI_CLASS` 声明的类型。

QJniArray 模板使处理返回或接受 Java 数组的 Java 方法变得非常简单。

注意: Java 数组可以包含基本类型和对象。 数组本身可被视为 Java 对象,JNI 框架提供了用于处理此类数组的显式 API。此外,Java 类库还提供了诸如List 或ArrayList 之类的容器类型。这些类型的对象无法由 QJniArray 表示。此时,请使用QJniObject 来调用特定类的成员函数。

要创建一个 QJniArray 实例,可以通过以下两种方式之一:从相应的 C++ 容器进行构造:

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

或者通过初始化列表:

const QJniArray intArray{1, 2, 3};

QJniArray 将创建一个新的 Java 数组,并将 C++ 侧的数据复制到其中。

当通过QJniObject::callMethod 调用返回数组的函数时(例如Java类String 中的char[] toCharArray() ),请将返回类型指定为C数组(如下所示的jchar[] ):

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

charArray 变量将具有QJniArray<jchar> 类型,并持有对jcharArray JNI 对象的新全局引用。

请注意,上述代码片段中的数组均为 const 类型。访问 const 数组的元素比对可变数组进行操作要高效得多。

QJniArray 也可以从现有的jarray 或QJniObject 构建。但请注意,系统不会进行类型检查以验证jarray 或QJniObject 是否确实表示一个包含指定类型元素的数组,访问类型不匹配的 QJniArray 将导致未定义行为。

QJniArray 中的数据既可以通过at() 或operator[]() 逐个元素访问,也可以通过迭代访问。

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

要将整个数组复制到 C++ 侧的 Qt 容器中,请使用toContainer() 函数。

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

这在

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

toContainer() 的返回类型取决于 QJniArray 的实例化类型。对于QJniArray<T> ,返回类型通常为QList<T> ,但以下情况除外:

特化C++ 类型
QJniArray<jbyte>QByteArray
QJniArray<char>QByteArray
QJniArray<jstring>QStringList
QJniArray<QString>QStringList

也可以创建一个不包含任何数据的固定大小数组,然后使用 `operator[]` 逐个元素填充该数组:

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

或可变迭代器:

QJniArray<QString> strings(size);
int i = 0;
for (auto string : strings) // note: not 'auto &string'
    string = u"Row %1"_s.arg(i++);

与 Java 一样,数组的大小无法更改,但可以将数组变量赋值给另一个数组。

注意:Java 数组限制为 32 位,而 QJniArray 的size_type 成员类型为jsize ,这是一种 32 位整数类型。若尝试从包含超过 2^32 个元素的 C++ 容器构建 QJniArray,将引发运行时断言。

成员类型文档

[alias] QJniArray::const_iterator

[alias] QJniArray::iterator

QJniArray 的随机访问迭代器。 /*

/*!

QJniArray 的随机访问常量迭代器。

[alias] QJniArray::const_reverse_iterator

[alias] QJniArray::reverse_iterator

QJniArray 的反向迭代器,即std::reverse_iterator<iterator> 的同义词。

注意:若要 使用 `operator->() `访问 反向迭代器的元素,则需要 C++20,因为 C++17 中的 `reverse_iterator ` 不支持返回代理对象的迭代器。 /*

/*!

QJniArray 的反向迭代器,与std::reverse_iterator<const_iterator> 同义。

注意: 使用operator->() 访问 反向迭代器的元素需要 C++20,因为 C++17 中的reverse_iterator 不支持返回代理对象的迭代器。

成员函数文档

[default] QJniArray::QJniArray()

QJniArray 的默认构造函数。这不会创建 Java 侧的数组,且该实例将无效。

另请参阅 isValid 。

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

构建一个 QJniArray,该对象封装了一个新创建的用于存储类型为Container::value_type 的元素的 Java 数组,并将container 中的数据填入该 Java 数组。

约束

仅当Container 是存储JNI type 或等效C++类型的元素且提供前向迭代器的容器时,才参与重载解析。

所构建的 QJniArray 的特化形式取决于container 的值类型。对于Container<T> (例如QList<T> ),它通常为QJniArray<T> ,但有以下例外:

容器特化
QByteArrayQJniArray<jbyte>
QStringListQJniArray<jstring>
容器::value_type特化
QJniObjectQJniArray<jobject>

另请参阅 QJniArrayBase::fromContainer() 和toContainer()。

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

通过从other 移动数据来构建一个QJniArray。other 数组将变为invalid 。

约束

仅当other 的元素类型Other 可转换为正在构建的QJniArray的元素类型T 时,才参与重载解析。但实际上不会进行任何转换。

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

默认构造一个QJniArray 实例。该函数已被删除。

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

构建一个大小为size 的空QJniArray。数组中的元素不会被初始化。

该函数在 Qt 6.9 中引入。

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

通过从object 中读取数据来构建一个QJniArray。QJniObject 将变为invalid 。

注意:此 构造函数不会验证 Java 侧的对象是否为正确类型的数组。访问类型不匹配的 QJniArray 将导致未定义行为。

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

通过复制other 来构建一个QJniArray。这两个QJniArray对象将引用同一个Java数组对象。

约束

仅当other 的元素类型Other 可转换为正在构建的 QJniArray 的元素类型T 时,才参与重载解析。但实际上不会进行任何转换。

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

默认构造一个QJniArray 实例。该函数已被删除。

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

构建一个 QJniArray,该对象封装与object 相同的 Java 数组,并创建一个新的全局引用。若要从现有的局部引用构建 QJniArray,请使用通过fromLocalRef() 构建的QJniObject 。

注意:此 构造函数不会验证 Java 侧的对象是否为正确类型的数组。访问类型不匹配的 QJniArray 将导致未定义行为。

[explicit] QJniArray::QJniArray(jarray array)

构建一个 QJniArray,该对象封装了 Java 侧的数组array ,并生成一个指向array 的新全局引用。

注意:此构造 函数不会验证 Java 侧的对象是否为正确类型的数组。访问类型不匹配的 QJniArray 将导致未定义的行为。

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

构建一个 QJniArray,该对象封装了一个新创建的用于存储T 类型元素的Java数组,并将list 中的数据填入该Java数组。

另请参阅 QJniArrayBase::fromContainer() 和toContainer()。

[default] QJniArray::~QJniArray()

销毁QJniArray 对象,并释放对被封装的Java数组的任何引用。

auto QJniArray::arrayObject() const

返回一个包装好的Java对象,将其转换为与该QJniArray 对象的元素类型T 相匹配的jarray 类型。

Tjarray 类型
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

返回包装后的 Java 数组中位于位置i 的值。

i 该索引必须是列表中的有效索引位置(即 0 <=i <size())。

另请参阅 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

返回一个指向数组中第一个元素的STL 风格常量迭代器。

如果数组是invalid ,则该函数将返回与相应的end()函数相同的迭代器。

另请参阅 end() 和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

返回一个STL 风格的迭代器,该迭代器指向列表中最后一个元素之后的位置。

另请参阅 begin() 和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

返回一个STL 风格的反向迭代器,该迭代器指向数组中第一个元素,且顺序为逆序。

如果数组为invalid ,则该函数将返回与对应的rend()函数相同的迭代器。

注意:若要 使用operator->() 访问 反向迭代器的元素,则需要 C++20,因为 C++17 中的reverse_iterator 不支持返回代理对象的迭代器。

另请参阅 rend() 和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

返回一个STL 风格的反向迭代器,该迭代器指向列表中最后一个元素之后的下一个位置,且顺序为反向。

注意:若要 使用 `operator->() `访问 反向迭代器所指向的元素,则需要 C++20 支持,因为 C++17 中的 `reverse_iterator ` 不支持返回代理对象的迭代器。

另请参阅 rbegin() 和end()。

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

返回一个装有被包装的 Java 数组中数据的容器。

如果未提供container ,则返回容器的类型取决于该QJniArray 的元素类型。对于QJniArray<T> ,该类型通常为QList<T> ,但有以下例外情况:

若向 `container` 传递一个命名容器(左值),则该容器将被填充,并返回对其的引用。若传递一个临时容器(右值,包括默认参数),则该容器将被填充,并按值返回。

如果数组为invalid ,则该函数立即返回。

另请参阅 QJniArrayBase::fromContainer()。

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

将other 移动到QJniArray 中,并返回对此的引用。other 数组变为invalid 。

约束

仅当other 的元素类型Other 可转换为此QJniArray 的元素类型T 时,才参与重载解析。但实际上不会发生任何转换。

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

将other 赋值给此QJniArray ,并返回对此对象的引用。这两个QJniArray 对象都将引用同一个Java数组对象。

约束

仅当other 的元素类型Other 可转换为QJniArray 的元素类型T 时,才参与重载解析。但实际上不会进行任何转换。

[since 6.9] QJniArray<T>::reference QJniArray::operator[](QJniArrayBase::size_type i)

返回包装的 Java 数组中位于位置i 处的值的引用对象。

i 该索引必须是列表中的有效位置(即 0 <=i <size())。

返回的引用对象包含位于位置i 的值,在大多数情况下会隐式转换为该值。对返回的引用进行赋值将覆盖 Java 数组中的该条目。但是,对该对象调用可变成员函数不会修改数组中的条目。要对该运算符的结果调用成员函数,请解引用该引用对象:

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

但是,如果无意修改数组本身的值,请将数组设为 const,或者改用at()。

该函数在 Qt 6.9 中引入。

另请参阅 at() 和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.