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

详细说明

QJniArray 模板可让您轻松使用返回或接收 Java 数组的 Java 方法。

注意: Java 数组可容纳原始类型和对象。数组本身可被视为 Java 对象,JNI 框架提供了明确的 API 来处理此类数组。此外,Java 类库还提供了诸如ListArrayList 等容器类型。这些类型的对象不能用 QJniArray 表示。相反,您可以使用QJniObject 来调用特定于类的成员函数。

要创建 QJniArray 实例,可以通过相应的 C++ 容器来构造它:

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

或从初始化器列表中创建:

const QJniArray intArray{1, 2, 3};

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

在调用通过QJniObject::callMethod 返回数组的函数(如 JavaString 类中的char[] toCharArray() )时,请将返回类型指定为 C 数组(下文中的jchar[] ):

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

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

请注意,上述代码片段中的数组都是常量数组。访问常数组中的元素比操作可变数组要有效得多。

QJniArray 也可以从现有的jarrayQJniObject 中构造。但要注意的是,我们不会执行类型检查来验证jarrayQJniObject 是否确实代表了一个持有指定类型元素的数组,访问不匹配的 QJniArray 会导致未定义的行为。

可以使用at() 或operator[]() 逐个元素访问 QJniArray 中的数据,也可以对其进行迭代。

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

要将整个数组复制到 C++ 侧的 Qt XML 容器中,请使用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<charQByteArray
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

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

[alias] QJniArray::const_reverse_iterator

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

成员函数文档

[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

返回一个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() 函数相同。

另请参见 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 样式的反向迭代器,以相反的顺序指向列表中最后一个项目之后。

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

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()。

QJniArray::QJniArray()

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

另请参阅 isValid

[explicit] template <typename Container, QJniArrayBase::if_compatible_source_container<Container> = true> 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, QJniArrayBase::if_convertible<Other, T> = true> QJniArray::QJniArray(QJniArray<Other> &&other)

other 开始构造一个 QJniArray。other 数组变为invalid

限制条件

只有当other 的元素类型Other 可转换为正在构造的 QJniArray 的元素类型T 时,才参与重载解析。但实际转换并不发生。

[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, QJniArrayBase::if_convertible<Other, T> = true> QJniArray::QJniArray(const QJniArray<Other> &other)

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

限制条件

只有当other 的元素类型Other 可转换为正在构造的 QJniArray 的元素类型T 时,才参与重载解析。但实际转换不会发生。

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

构造一个 QJniArray,封装与object 相同的 Java 数组,创建一个新的全局引用。要从现有的本地引用构造一个 QJniArray,请使用通过fromLocalRef() 构造的QJniObject

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

[explicit] QJniArray::QJniArray(jarray array)

构造一个封装了 Java 端数组array 的 QJniArray,为array 创建一个新的全局引用。

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

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

构造一个 QJniArray,为T 类型的元素封装一个新创建的 Java 数组,并用list 中的数据填充 Java 数组。

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

QJniArray::~QJniArray()

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

auto QJniArray::arrayObject() const

返回包装后的 Java 对象,作为与该QJniArray 对象的元素类型T 匹配的合适jarray 类型。

Tjarray 类型
jbytejbyteArray
jcharjcharArray
......
工作项目工作项目数组
QJniObject工作项目数组
Q_DECLARE_JNI_CLASS工作项目数组

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

返回一个容器,其中填充了封装 Java 数组中的数据。

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

如果你为container 传递一个命名的容器(一个 l 值),那么该容器将被填充,并返回对它的引用。如果传入一个临时容器(一个 r 值,包括默认参数),那么该容器将被填充,并按值返回。

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

另请参见 QJniArrayBase::fromContainer().

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

other 移入QJniArray ,并返回对 的引用。other 数组变为invalid

限制条件

只有当other 的元素类型Other 可转换为 thisQJniArray 的元素类型T 时,才会参与重载解析。但不会进行实际转换。

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

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

限制条件

只有当other 的元素类型Other 可转换为 thisQJniArray 的元素类型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()) {
        // ...
    }
}

但是,如果不打算修改数组本身的值,则应使数组常量化,或使用at() 代替。

此函数在 Qt 6.9 中引入。

另请参阅 at() 和size()。

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