이 페이지에서

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 배열의 요소 유형을 지정합니다. 이 유형은 ` jint `이나 ` jbyte`과 같은 JNI 기본 유형이거나, ` 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 멤버 유형은 32비트 정수형인 ` jsize`입니다. 2^32개 이상의 요소를 포함하는 C++ 컨테이너로 QJniArray를 생성하려고 하면 런타임 어서션이 발생합니다.

멤버 유형 문서

[alias] QJniArray::const_iterator

[alias] QJniArray::iterator

QJniArray 용 랜덤 액세스 이터레이터. /*

/*!

QJniArray 에 대한 랜덤 액세스, const 이터레이터입니다.

[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> 의 동의어입니다.

참고: 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> 가 되지만, 다음 예외가 있습니다:

컨테이너특화
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)

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 객체를 반환합니다.

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 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()` 함수와 동일한 이터레이터를 반환합니다.

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()` 함수와 동일한 이터레이터를 반환합니다.

참고: 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 는 프록시 객체를 반환하는 이터레이터를 지원하지 않기 때문입니다.

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 에 명명된 컨테이너(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에서 도입되었습니다.

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.