QJniArray Class
template <typename T> class QJniArrayQJniArrayクラスは、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クラス・ライブラリは、List
やArrayList
のようなコンテナ型を提供している。これらの型のオブジェクトはQJniArrayでは表現できません。代わりに、QJniObject を使用して、クラス固有のメンバ関数を呼び出してください。
QJniArrayインスタンスを作成するには、対応するC++コンテナから構築します:
またはイニシャライザー・リストから:
const QJniArray intArray{1, 2, 3};
QJniArrayは新しいJava配列を作成し、C++側のデータをそこにコピーします。
JavaのString
クラスのchar[] toCharArray()
のように、QJniObject::callMethod を介して配列を返す関数を呼び出す場合は、戻り値の型を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
ランダムアクセス可能な,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 形式の const イテレータを返します。
配列がinvalid の場合、対応するend() 関数と同じイテレータを返します。
[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 形式のイテレータを返します。
[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() 関数と同じイテレータを返します。
[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 形式の逆順イテレータを返します。
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 を構築します。この QJniArray は、Container::value_type
型の要素用に新しく作成された Java 配列をラップし、container からのデータで Java 配列を埋めます。
制約
Container
がJNI type または同等の C++ 型の要素を格納するコンテナであり、前方イテレータを提供する場合に のみ、オーバーロード解決に参加します。
構築された QJniArray の特殊化は、container の値型に依存します。Container<T>
(例えば、QList<T>
など)の場合、以下の例外を除いて、通常はQJniArray<T>
になります:
コンテナ | 特殊化 |
---|---|
QByteArray | QJniArray<jbyte>。 |
QStringList | QJniArray<jstring>。 |
コンテナ::value_type | 特殊化 |
QJniObject | QJniArray<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)
object と同じ Java 配列をラップする QJniArray を構築し、新しいグローバル参照を作成する。既存のローカル参照から 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 を構築します。この QJniArray は、T
型の要素用に新しく作成された Java 配列をラップし、list からのデータで Java 配列を埋めます。
QJniArrayBase::fromContainer() およびtoContainer()も参照してください 。
QJniArray::~QJniArray()
QJniArray オブジェクトを破棄し、ラップされた Java 配列への参照をすべて解放します。
auto QJniArray::arrayObject() const
このQJniArray オブジェクトの要素型T
と一致する、適切なjarray
型としてラップされた Java オブジェクトを返します。
T | jarray型 |
---|---|
jbyte | jbyteArray |
jchar | jchar配列 |
... | ... |
ジョブジェクト | jobject配列 |
QJniObject | jobject配列 |
Q_DECLARE_JNI_CLASS | jobject配列 |
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>
となる:
特殊化 | C++型 |
---|---|
QJniArray<jbyte> | QByteArray |
QJniArray<char> | QByteArray |
QJniArray<jstring | QStringList |
QJniArray<QString | QStringList |
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
が、このQJniArray の要素型T
に変換可能である場合にのみ、オーバーロード解決に参加します。 ただし、実際の変換は行われません。
template <typename Other, QJniArrayBase::if_convertible<Other, T> = true> 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 で導入されました。
© 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.