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) | |
| 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 配列の要素型を指定するテンプレートクラスです。この型は、jint やjbyte などの JNI プリミティブ型、あるいはjobject やjstring などのオブジェクト型、あるいはQ_DECLARE_JNI_CLASS で宣言された型にすることができます。
QJniArray テンプレートを使用すると、Java 配列を返したり受け取ったりする Java メソッドを簡単に扱うことができます。
注: Java 配列には、プリミティブ型やオブジェクトを格納することができます。 配列自体は Java オブジェクトと同様に扱うことができ、JNI フレームワークは、そのような配列を操作するための明示的な API を提供しています。さらに、Java クラスライブラリは、List やArrayList などのコンテナ型を提供しています。これらの型のオブジェクトは、QJniArray では表現できません。その代わりに、QJniObject を使用して、クラス固有のメンバ関数を呼び出してください。
QJniArrayインスタンスを作成するには、対応するC++コンテナから生成するか:
または、初期化リストから作成します:
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を構築しようとすると、実行時のアサーションが発生します。
メンバ型のドキュメント
QJniArray 用のランダムアクセスイテレータ。 /*
/*!
QJniArray 用のランダムアクセス型、constイテレータ。
QJniArray の逆イテレータ。std::reverse_iterator<iterator> の別名。
注: operator->() を使用してリバースイテレータの要素にアクセスするには C++20 が必要です。C++17 のreverse_iterator は、プロキシオブジェクトを返すイテレータをサポートしていないためです。 /*
/*!
QJniArray の逆イテレータであり、std::reverse_iterator<const_iterator> の別名です。
注: C++17 のreverse_iterator はプロキシオブジェクトを返すイテレータをサポートしていないため、operator->() を使用して逆イテレータの要素にアクセスするには C++20 が必要です。
メンバ関数のドキュメント
[default] QJniArray::QJniArray()
QJniArray のデフォルトコンストラクタです。これは Java 側の配列を作成しないため、インスタンスは無効となります。
isValidも参照してください 。
[explicit] template <typename Container> requires if_compatible_source_container<Container> QJniArray::QJniArray(Container &&container)
Container::value_type 型の要素を持つ、新しく作成されたJava配列をラップするQJniArrayを構築し、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> 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)
object と同じJava配列をラップするQJniArrayを生成し、新しいグローバル参照を作成します。既存のローカル参照からQJniArrayを生成するには、fromLocalRef()で生成されたQJniObject を使用してください。
注:この コンストラクタは 、Java 側のオブジェクトが正しい型の配列であるかどうかについて、いかなる検証も行いません。型が一致しない QJniArray にアクセスすると、未定義の挙動が生じます。
[explicit] QJniArray::QJniArray(jarray array)
Java側の配列array をラップするQJniArrayを構築し、array への新しいグローバル参照を作成します。
注:この コンストラクタは、Java側のオブジェクトが正しい型の配列であるかどうかを検証しません。型が一致しないQJniArrayにアクセスすると、未定義の挙動が生じます。
[implicit] QJniArray::QJniArray(std::initializer_list<T> &list)
T 型の要素を持つ、新しく作成された Java 配列をラップする QJniArray を構築し、list のデータでその Java 配列に値を設定します。
QJniArrayBase::fromContainer() およびtoContainer()も参照してください 。
[default] QJniArray::~QJniArray()
QJniArray オブジェクトを破棄し、ラップされたJava配列への参照をすべて解放します。
auto QJniArray::arrayObject() const
このQJniArray オブジェクトの要素型T に一致する適切なjarray 型として、ラップされたJavaオブジェクトを返します。
| T | jarray 型 |
|---|---|
| jbyte | jbyteArray |
| jchar | jcharArray |
| ... | ... |
| jobject | jobjectArray |
| QJniObject | jobjectArray |
| Q_DECLARE_JNI_CLASS | jobjectArray |
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 i は、リスト内の有効なインデックス位置でなければなりません(つまり、0 <= < ())。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 形式の 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()関数と同じイテレータを返します。
注: C++17のreverse_iterator はプロキシオブジェクトを返すイテレータをサポートしていないため、operator->() を使用して逆順イテレータの要素にアクセスするにはC++20 が必要です。
「 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 では、プロキシオブジェクトを返すイテレータはサポートされていないためです。
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> になりますが、以下の例外があります:
| 特化 | C++型 |
|---|---|
| QJniArray<jbyte> | QByteArray |
| QJniArray<char> | QByteArray |
| QJniArray<jstring> | QStringList |
| QJniArray<QString> | QStringList |
container に名前付きコンテナ(lvalue)を引数として渡した場合、そのコンテナにデータが格納され、その参照が返されます。一時コンテナ(rvalue、デフォルト引数を含む)を引数として渡した場合、そのコンテナにデータが格納され、値として返されます。
この関数は、配列が `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 i は、リスト内の有効なインデックス位置でなければなりません(つまり、0 <= < ())。size
返される参照オブジェクトは、位置i にある値を保持しており、ほとんどの場合、その値に暗黙的に変換されます。返された参照に値を代入すると、Java 配列内のエントリが上書きされます。ただし、そのオブジェクトに対して変更を伴うメンバ関数を呼び出しても、配列内のエントリは変更されません。この演算子の結果に対してメンバ関数を呼び出すには、参照オブジェクトの参照を解除してください:
QJniArray<QString> strings = object.callMethod<QString[]>("getStrings");
if (!strings.isEmpty()) {
if (!(*array[0]).isEmpty()) {
// ...
}
}ただし、配列自体の値を変更する意図がない場合は、配列を const に指定するか、代わりにat() を使用してください。
この関数は Qt 6.9 で導入されました。
© 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.