QJniObject Class
자바 네이티브 인터페이스(JNI)를 둘러싼 편리한 래퍼입니다. 더 보기...
Header: | #include <QJniObject> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
이후: | Qt 6.1 |
공용 함수
QJniObject() | |
QJniObject(const char *className) | |
QJniObject(jclass clazz) | |
QJniObject(jobject object) | |
(since 6.4) | QJniObject(const char *className, Args &&... args) |
(since 6.4) | QJniObject(jclass clazz, Args &&... args) |
QJniObject(const char *className, const char *signature, ...) | |
QJniObject(jclass clazz, const char *signature, ...) | |
~QJniObject() | |
(since 6.4) auto | callMethod(const char *methodName, Args &&... args) const |
(since 6.4) auto | callMethod(const char *methodName, const char *signature, Args &&... args) const |
(since 6.4) QJniObject | callObjectMethod(const char *methodName, Args &&... args) const |
QJniObject | callObjectMethod(const char *methodName, const char *signature, ...) const |
(since 6.2) QByteArray | className() const |
auto | getField(const char *fieldName) const |
QJniObject | getObjectField(const char *fieldName) const |
QJniObject | getObjectField(const char *fieldName, const char *signature) const |
bool | isValid() const |
jobject | object() const |
T | object() const |
(since 6.2) jclass | objectClass() const |
void | setField(const char *fieldName, T value) |
void | setField(const char *fieldName, const char *signature, T value) |
(since 6.8) void | swap(QJniObject &other) |
QString | toString() const |
QJniObject & | operator=(T object) |
정적 공개 멤버
(since 6.7) auto | callStaticMethod(const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args) |
(since 6.4) auto | callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args) |
auto | callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args) |
(since 6.4) QJniObject | callStaticObjectMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args) |
QJniObject | callStaticObjectMethod(jclass clazz, jmethodID methodId, ...) |
QJniObject | callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...) |
QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...) |
(since 6.4) QJniObject | construct(Args &&... args) |
QJniObject | fromLocalRef(jobject localRef) |
QJniObject | fromString(const QString &string) |
auto | getStaticField(const char *fieldName) |
auto | getStaticField(const char *className, const char *fieldName) |
auto | getStaticField(jclass clazz, const char *fieldName) |
QJniObject | getStaticObjectField(const char *className, const char *fieldName) |
QJniObject | getStaticObjectField(jclass clazz, const char *fieldName) |
QJniObject | getStaticObjectField(const char *className, const char *fieldName, const char *signature) |
QJniObject | getStaticObjectField(jclass clazz, const char *fieldName, const char *signature) |
bool | isClassAvailable(const char *className) |
auto | setStaticField(const char *fieldName, T value) |
void | setStaticField(const char *className, const char *fieldName, T value) |
void | setStaticField(jclass clazz, const char *fieldName, T value) |
void | setStaticField(const char *className, const char *fieldName, const char *signature, T value) |
void | setStaticField(jclass clazz, const char *fieldName, const char *signature, T value) |
관련 비회원
bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
bool | operator==(const QJniObject &o1, const QJniObject &o2) |
상세 설명
QJniObject 클래스는 Java 객체에 대한 참조를 래핑하여 가비지 수집이 되지 않도록 하고 대부분의 JNIEnv
메서드 호출(멤버, 정적) 및 필드(설정자, 게터)에 대한 액세스를 제공합니다. 예외 처리를 포함한 모든 작업에 대해 직접 JNI 액세스를 사용하면 일반적으로 필요한 많은 상용구가 제거됩니다.
참고: 이 API는 Android에서 사용하도록 설계 및 테스트되었습니다. 다른 플랫폼에서는 테스트되지 않았습니다.
메서드 서명
QJniObject는 제공되거나 추론된 템플릿 인수를 기반으로 올바른 서명을 사용하는 편의 함수를 제공합니다.
jint x = QJniObject::callMethod<jint>("getSize"); QJniObject::callMethod<void>("touch"); jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());
이러한 함수는 가변 템플릿이며 컴파일러는 실제 인수 유형에서 서명을 추론합니다. 반환 유형만 명시적으로 제공하면 됩니다. QJniObject는 JNI types 를 취하는 함수와 QtJniTypes 유형 매핑으로 선언된 유형에 대한 서명 문자열을 추론할 수 있습니다.
// Java class package org.qtproject.qt; class TestClass { static TestClass create() { ... } static String fromNumber(int x) { ... } static String[] stringArray(String s1, String s2) { ... } }
// C++ code Q_DECLARE_JNI_CLASS(TestClass, "org/qtproject/qt/TestClass") // ... using namespace QtJniTypes; TestClass testClass = TestClass::callStaticMethod<TestClass>("create");
따라서 JNI 서명 문자열을 명시적으로 생성하지 않고도 C++ 코드에서 임의의 Java 및 Android 유형으로 작업할 수 있습니다.
명시적 JNI 서명
서명을 직접 제공할 수도 있습니다. 이 경우 서명이 호출하려는 함수와 일치하는 것이 중요합니다.
- 예를 들어 클래스 이름은
"java/lang/String"
과 같이 정규화된 이름이어야 합니다. - 메서드 서명은
"(ArgumentsTypes)ReturnType"
, JNI Types 을 참조하세요. - 모든 객체 유형은 QJniObject로 반환됩니다.
아래 예시는 다양한 정적 함수를 호출하는 방법을 보여줍니다:
서명 구조는 "(ArgumentsTypes)ReturnType"
입니다. 서명의 배열 타입에는 [
접두사가 있어야 하며, 정규화된 Object
타입 이름에는 L
접두사와 ;
접미사가 있어야 합니다. create
함수의 서명은 "()Lorg/qtproject/qt/TestClass;
입니다. 두 번째 및 세 번째 함수에 대한 서명은 각각 "(I)Ljava/lang/String;"
및 "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
입니다.
create()
함수는 다음과 같이 호출할 수 있습니다:
// C++ code QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass", "create", "()Lorg/qtproject/qt/TestClass;");
두 번째와 세 번째 함수의 경우 QJniObject의 템플릿 메서드를 사용하여 암시적 서명 문자열을 만들 수 있지만 서명 문자열을 명시적으로 전달할 수도 있습니다:
// C++ code QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass", "fromNumber", "(I)Ljava/lang/String;", 10);
암시적 서명 생성이 작동하려면 반환 유형을 명시적으로 지정해야 합니다:
// C++ code QJniObject string1 = QJniObject::fromString("String1"); QJniObject string2 = QJniObject::fromString("String2"); QJniObject stringArray = QJniObject::callStaticObjectMethod<jobjectArray>( "org/qtproject/qt/TestClass", "stringArray", string1.object<jstring>(), string2.object<jstring>());
첫 번째 템플릿 매개변수가 Java 함수의 반환 유형을 지정하더라도 메서드는 여전히 QJniObject를 반환한다는 점에 유의하세요.
Java 예외 처리
예외를 발생시킬 수 있는 Java 함수를 호출한 후에는 계속하기 전에 예외를 확인하고 처리하고 지우는 것이 중요합니다. 모든 QJniObject 함수는 예외를 보고하고 지우는 방식으로 내부적으로 예외를 처리하므로 클라이언트 코드에서 예외를 처리할 필요가 없습니다.
참고: 사용자는 JNIEnv
을 직접 사용하여 JNI 호출을 수행할 때 예외를 수동으로 처리해야 합니다. 예외가 보류 중일 때 다른 JNI 호출을 하는 것은 안전하지 않습니다. 자세한 내용은 QJniEnvironment::checkAndClearExceptions()를 참조하세요.
Java 네이티브 메서드
Java 네이티브 메서드를 사용하면 Java에서 네이티브 코드를 호출할 수 있으며, 이는 Java에서 함수 선언을 만든 후 native
키워드를 접두사로 붙이면 됩니다. Java에서 네이티브 함수를 호출하려면 먼저 Java 네이티브 함수를 코드의 네이티브 함수에 매핑해야 합니다. 함수 매핑은 QJniEnvironment::registerNativeMethods()를 호출하여 수행할 수 있습니다.
아래 예는 이를 수행하는 방법을 보여줍니다.
Java 구현:
class FooJavaClass { public static void foo(int x) { if (x < 100) callNativeOne(x); else callNativeTwo(x); } private static native void callNativeOne(int x); private static native void callNativeTwo(int x); }
C++ 구현:
정적 void fromJavaOne(JNIEnv *env, jobject thiz, jint x){ Q_UNUSED(env); Q_UNUSED(thiz); qDebug() << x << "< 100"; }static void fromJavaTwo(JNIEnv *env, jobject thiz, jint x){ Q_UNUSED(env); Q_UNUSED(thiz); qDebug() << x << ">= 100"; }void foo() { // 네이티브 메서드를 먼저 등록합니다, 이상적으로는 앱 시작과 함께 하는 것이 좋습니다 const JNINativeMethod methods[] ={{"callNativeOne", "(I)V", reinterpret_cast<void *>(fromJavaOne)},{"callNativeTwo ", "(I)V", reinterpret_cast<void *>(fromJavaTwo)}}; QJniEnvironment env; env.registerNativeMethods("my/java/project/FooJavaClass", methods, 2); // C++ 함수를 다시 호출할 자바 메서드를 호출합니다. QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10); // 출력: 10 < 100 QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Output: 100 >= 100}
자바 객체의 수명
Java에서 받은 대부분의 objects 은 로컬 참조이며 네이티브 메서드에서 반환할 때까지만 유효합니다. 그 이후에는 객체가 가비지 수집 대상이 됩니다. 코드가 루프에서 많은 로컬 참조를 생성하는 경우 반복할 때마다 수동으로 삭제해야 하며, 그렇지 않으면 메모리가 부족해질 수 있습니다. 자세한 내용은 JNI 디자인 개요를 참조하세요 : 전역 및 로컬 참조를 참조하세요. 네이티브 메서드 범위 외부에서 생성된 로컬 참조는 가비지 수집기가 자동으로 해제하지 않으므로 수동으로 삭제해야 합니다( AttachCurrentThread를 사용하기 때문에). 자세한 내용은 JNI 팁을 참조하세요 : 로컬 및 전역 참조를 참조하세요.
Java 객체를 계속 유지하려면 객체에 대한 새 전역 참조를 생성하고 작업이 완료되면 해제하거나 새 QJniObject를 생성하여 이 객체가 Java 객체의 수명을 관리하도록 해야 합니다.
참고: 글로벌 참조 또는 로컬 참조에서 QJniObject를 구성하는 경우 해당 참조는 QJniObject에서 해제되지 않으며, QJniObject는 자체 참조만 관리합니다.
JNI 유형
객체 유형
유형 | 서명 |
---|---|
jobject | 자바/랭/객체; |
jclass | Ljava/lang/Class; |
jstring | Ljava/lang/String; |
jthrowable | Ljava/lang/Throwable; |
jobjectArray | [Ljava/lang/Object; |
jarray | [<유형> |
jbooleanArray | [Z |
jbyteArray | [B |
jcharArray | [C |
jshortArray | [S |
jintArray | [I |
jlongArray | [J |
jfloatArray | [F |
jdoubleArray | [D |
프리미티브 형
타입 | 시그니처 |
---|---|
jboolean | Z |
jbyte | B |
jchar | C |
jshort | S |
jint | I |
jlong | J |
jfloat | F |
jdouble | D |
기타
유형 | 서명 |
---|---|
void | V |
사용자 정의 유형 | L<정격 이름>; |
JNI에 대한 자세한 내용은 자바 네이티브 인터페이스 사양을 참조하세요.
QJniEnvironment 및 object()도 참조하세요 .
멤버 함수 문서
QJniObject 가 보유한 객체를 잡젝트 또는 T 유형으로 반환합니다. T는 JNI Object Types 중 하나일 수 있습니다.
QJniObject string = QJniObject::fromString("Hello, JNI"); jstring jstring = string.object<jstring>();
참고: 반환된 객체는 이 QJniObject 에 의해 계속 살아있게 유지됩니다. 예를 들어 나중에 사용할 수 있도록 기록하기 위해 이 QJniObject 의 수명 이후에도 객체를 유지하려면 가장 쉬운 방법은 적절한 수명을 가진 다른 QJniObject 에 저장하는 것입니다. 또는 개체에 대한 새 전역 참조를 만들어 저장한 후 작업이 끝나면 해제하도록 주의할 수 있습니다.
void functionScope() { QString helloString("Hello"); jstring myJString = 0; { QJniObject string = QJniObject::fromString(helloString); myJString = string.object<jstring>(); } // Ops! myJString is no longer valid. }
QJniObject::QJniObject()
잘못된 JNI 객체를 생성합니다.
isValid()도 참조하십시오 .
[explicit]
QJniObject::QJniObject(const char *className)
className 의 기본 생성자를 호출하여 새 JNI 객체를 생성합니다.
QJniObject myJavaString("java/lang/String");
[explicit]
QJniObject::QJniObject(jclass clazz)
clazz 의 기본 생성자를 호출하여 새 JNI 객체를 생성합니다.
참고: QJniObject는 clazz 클래스에 대한 새 참조를 생성하고 클래스가 소멸되면 다시 해제합니다. QJniObject 외부에서 생성된 클래스에 대한 참조는 호출자가 관리해야 합니다.
QJniObject::QJniObject(jobject object)
Java 객체 object 를 중심으로 새 JNI 객체를 생성합니다.
참고: QJniObject는 Java 객체 object 에 대한 참조를 보유하고 있다가 소멸되면 이를 해제합니다. QJniObject 외부의 Java 객체 object 에 대한 모든 참조는 호출자가 관리해야 합니다. 로컬 참조를 직접 관리하려는 경우가 아니라면 대부분의 경우 로컬 참조로 이 함수를 호출해서는 안 됩니다. 로컬 참조를 QJniObject로 변환하는 방법은 QJniObject::fromLocalRef()를 참조하세요.
fromLocalRef()도 참조하세요 .
[explicit, since 6.4]
template <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)
인자 args 를 사용하여 className 의 생성자를 호출하여 새 JNI 객체를 생성합니다. 이 생성자는 args 가 모두 알려진 경우에만 사용할 수 있습니다 JNI Types.
QJniEnvironment env; char* str = "Hello"; jstring myJStringArg = env->NewStringUTF(str); QJniObject myNewJavaString("java/lang/String", myJStringArg);
이 함수는 Qt 6.4에 도입되었습니다.
[explicit, since 6.4]
template <typename... Args> QJniObject::QJniObject(jclass clazz, Args &&... args)
args 인수를 사용하여 생성자를 호출하여 clazz 에서 새 JNI 객체를 생성합니다. 이 생성자는 args 이 모두 알려진 경우에만 사용할 수 있습니다 JNI Types.
QJniEnvironment env; jclass myClazz = env.findClass("org/qtproject/qt/TestClass"); QJniObject(myClazz, 3);
이 함수는 Qt 6.4에 도입되었습니다.
[explicit]
QJniObject::QJniObject(const char *className, const char *signature, ...)
className 의 생성자를 호출하고 signature 후속 인수의 유형을 지정하여 새 JNI 객체를 생성합니다.
QJniEnvironment env; char* str = "Hello"; jstring myJStringArg = env->NewStringUTF(str); QJniObject myNewJavaString("java/lang/String", "(Ljava/lang/String;)V", myJStringArg);
[explicit]
QJniObject::QJniObject(jclass clazz, const char *signature, ...)
signature 으로 생성자를 호출하고 후속 인수의 유형을 지정하여 clazz 에서 새 JNI 객체를 생성합니다.
QJniEnvironment env; jclass myClazz = env.findClass("org/qtproject/qt/TestClass"); QJniObject(myClazz, "(I)V", 3);
[noexcept]
QJniObject::~QJniObject()
JNI 객체를 삭제하고 JNI 객체가 보유한 모든 참조를 해제합니다.
[since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const
args 인수를 사용하여 methodName 메서드를 호출하고 값을 반환합니다( Ret
이 void
이 아닌 경우). Ret
이 잡젝트 타입인 경우 반환되는 값은 QJniObject 입니다.
QJniObject myJavaString("org/qtproject/qt/TestClass"); jint size = myJavaString.callMethod<jint>("length");
메서드 서명은 컴파일 타임에 Ret
와 args 의 형으로부터 추론됩니다.
이 함수는 Qt 6.4에 도입되었습니다.
[since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const
후속 인수의 유형을 지정하는 signature 을 사용하여 객체의 메서드 methodName 를 호출하고 args 값을 반환합니다( Ret
이 void
이 아닌 경우). Ret
이 잡젝트 타입이면, 반환되는 값은 QJniObject 입니다.
QJniObject myJavaString("org/qtproject/qt/TestClass"); jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);
이 함수는 Qt 6.4에 도입되었습니다.
[since 6.4]
template <typename Ret, typename... Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&... args) const
args 인수를 사용하여 Java 객체 메서드 methodName 를 호출하고 반환된 Java 객체에 대해 새 QJniObject 를 반환합니다.
QJniObject myJavaString = QJniObject::fromString("Hello, Java"); QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");
메서드 서명은 컴파일 시 Ret
와 args 의 유형으로부터 추론됩니다.
이 함수는 Qt 6.4에 도입되었습니다.
QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const
후속 인수의 유형을 지정하는 signature 을 사용하여 Java 객체의 메서드 methodName 를 호출합니다.
QJniObject myJavaString = QJniObject::fromString("Hello, Java"); QJniObject mySubstring = myJavaString.callObjectMethod("substring", "(II)Ljava/lang/String;", 7, 11);
[static, since 6.7]
template <typename Klass, typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
Klass
클래스에서 정적 메서드 methodName 를 호출하고 Ret
타입의 값을 반환합니다( Ret
이 void
인 경우 제외). Ret
이 잡젝트 타입인 경우 반환되는 값은 QJniObject 입니다.
메서드 서명은 컴파일 시 Ret
에서 args 의 타입을 추론합니다. Klass
는 Java 타입에 등록된 타입 매핑이 있는 C++ 타입이어야 합니다.
이 함수는 Qt 6.7에 도입되었습니다.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)
인자 args 를 사용하여 className 클래스에서 정적 메서드 methodName 를 호출하고 Ret
타입의 값을 반환합니다( Ret
가 void
인 경우 제외). Ret
이 잡젝트 타입이면 반환되는 값은 QJniObject 입니다.
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");
메서드 서명은 컴파일 타임에 Ret
와 args 의 형으로부터 추론됩니다.
이 함수는 Qt 6.4에 도입되었습니다.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)
clazz 에서 정적 메서드 methodName 를 호출하고 Ret
타입의 값을 반환합니다( Ret
이 void
인 경우 제외). Ret
가 잡젝트 타입인 경우 반환되는 값은 QJniObject 입니다.
QJniEnvironment env; jclass javaMathClass = env.findClass("java/lang/Math"); jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");
메서드 서명은 컴파일 타임에 Ret
와 args 의 형으로부터 추론됩니다.
이 함수는 Qt 6.4에 도입되었습니다.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)
clazz 클래스에서 methodId 로 식별되는 정적 메서드를 후속 인자와 함께 호출하고 Ret
타입의 값을 반환합니다( Ret
이 void
인 경우 제외). Ret
이 잡젝트 유형인 경우 반환되는 값은 QJniObject 입니다.
clazz 와 methodId 이 이전 작업에서 이미 캐시된 경우에 유용합니다.
QJniEnvironment env; jclass javaMathClass = env.findClass("java/lang/Math"); jmethodID methodId = env.findStaticMethod(javaMathClass, "max", "(II)I"); if (methodId != 0) { jint a = 2; jint b = 4; jint max = QJniObject::callStaticMethod<jint>(javaMathClass, methodId, a, b); }
이 함수는 Qt 6.4에 도입되었습니다.
[static, since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
className 클래스에서 정적 메서드 methodName 를 호출하고 signature 후속 인자의 유형을 지정합니다 args. 메서드의 결과를 반환합니다( Ret
이 void
이 아닌 경우). Ret
이 잡젝트 타입이면, 반환되는 값은 QJniObject 입니다.
jint a = 2; jint b = 4; jint max = QJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);
이 함수는 Qt 6.4에 도입되었습니다.
[static]
template <typename Ret, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)
clazz 에서 정적 메서드 methodName 를 호출하고 signature 에서 후속 인수의 유형을 지정합니다. 메서드의 결과를 반환합니다( Ret
이 void
이 아닌 경우). Ret
가 잡젝트 유형인 경우 반환되는 값은 QJniObject 입니다.
QJniEnvironment env; jclass javaMathClass = env.findClass("java/lang/Math"); jint a = 2; jint b = 4; jint max = QJniObject::callStaticMethod<jint>(javaMathClass, "max", "(II)I", a, b);
[static, since 6.4]
template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, Args &&... args)
className 클래스에서 methodName 로 정적 메서드를 호출하고 args 인수를 전달한 후 반환된 Java 객체에 대해 새 QJniObject 를 반환합니다.
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");
메서드 서명은 컴파일 시 Ret
와 args 의 유형으로부터 추론됩니다.
이 함수는 Qt 6.4에 도입되었습니다.
[static, since 6.4]
template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)
clazz 에서 methodName 로 정적 메서드를 호출하고 인자 args 를 전달한 다음 반환된 Java 객체에 대해 새 QJniObject 를 반환합니다.
이 함수는 Qt 6.4에 도입되었습니다.
[static]
QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
clazz 클래스에서 methodId 로 식별되는 정적 메서드를 후속 인자와 함께 호출합니다. clazz 및 methodId 이 이전 작업에서 이미 캐시된 경우에 유용합니다.
QJniEnvironment env; jclass clazz = env.findClass("java/lang/String"); jmethodID methodId = env.findStaticMethod(clazz, "valueOf", "(I)Ljava/lang/String;"); if (methodId != 0) QJniObject str = QJniObject::callStaticObjectMethod(clazz, methodId, 10);
[static]
QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...)
className 클래스에서 정적 메서드 methodName 를 호출하고 signature 는 후속 인수의 유형을 지정합니다.
QJniObject thread = QJniObject::callStaticObjectMethod("java/lang/Thread", "currentThread", "()Ljava/lang/Thread;"); QJniObject string = QJniObject::callStaticObjectMethod("java/lang/String", "valueOf", "(I)Ljava/lang/String;", 10);
[static]
QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...)
clazz 클래스에서 정적 메서드 methodName 를 호출하고 signature 는 후속 인수의 유형을 지정합니다.
[since 6.2]
QByteArray QJniObject::className() const
QJniObject 가 보유한 클래스 객체의 이름을 QByteArray
로 반환합니다.
이 함수는 Qt 6.2에 도입되었습니다.
[static, since 6.4]
template <typename Class, typename... Args> QJniObject QJniObject::construct(Args &&... args)
Class
에 해당하는 Java 클래스의 인스턴스를 생성하고 JNI 객체가 포함된 QJniObject 을 반환합니다. args 의 인수는 Java 생성자에게 전달됩니다.
QJniObject javaString = QJniObject::construct<jstring>();
이 함수는 args 이 모두 알려진 경우에만 사용할 수 있습니다 JNI Types.
이 함수는 Qt 6.4에 도입되었습니다.
[static]
QJniObject QJniObject::fromLocalRef(jobject localRef)
로컬 JNI 참조 localRef 에서 QJniObject 을 만듭니다. 이 함수는 localRef 의 소유권을 가져와서 반환하기 전에 해제합니다.
참고: 이 함수는 로컬 JNI 참조로만 호출하세요. 예를 들어, 대부분의 원시 JNI 호출은 JNI 환경을 통해 자바 객체에 대한 로컬 참조를 반환합니다.
jobject localRef = env->GetObjectArrayElement(array, index); QJniObject element = QJniObject::fromLocalRef(localRef);
[static]
QJniObject QJniObject::fromString(const QString &string)
QString string 에서 Java 문자열을 생성하고 해당 문자열이 포함된 QJniObject 을 반환합니다.
QString myQString = "QString"; QJniObject myJavaString = QJniObject::fromString(myQString);
toString()도 참조하세요 .
template <typename T> auto QJniObject::getField(const char *fieldName) const
필드 값을 검색합니다 fieldName.
QJniObject volumeControl("org/qtproject/qt/TestClass"); jint fieldValue = volumeControl.getField<jint>("FIELD_NAME");
template <typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const
필드에서 JNI 객체를 검색합니다 fieldName.
QJniObject field = jniObject.getObjectField<jstring>("FIELD_NAME");
QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const
signature 을 사용하여 fieldName 필드에서 JNI 객체를 검색합니다.
참고: 이 함수는 템플릿 유형 없이 사용할 수 있습니다.
QJniObject field = jniObject.getObjectField("FIELD_NAME", "Ljava/lang/String;");
[static]
template <typename Klass, typename T> auto QJniObject::getStaticField(const char *fieldName)
Klass
클래스에 대한 정적 필드 fieldName 에서 값을 검색합니다.
Klass
Java 타입에 등록된 타입 매핑이 있는 C++ 타입이어야 합니다.
[static]
template <typename T> auto QJniObject::getStaticField(const char *className, const char *fieldName)
className 클래스의 정적 필드 fieldName 에서 값을 검색합니다.
[static]
template <typename T> auto QJniObject::getStaticField(jclass clazz, const char *fieldName)
clazz 의 정적 필드 fieldName 에서 값을 검색합니다.
[static]
template <typename T> QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)
className 클래스의 fieldName 필드에서 객체를 검색합니다.
QJniObject jobj = QJniObject::getStaticObjectField<jstring>("class/with/Fields", "FIELD_NAME");
[static]
template <typename T> QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)
clazz 의 fieldName 필드에서 개체를 검색합니다.
QJniObject jobj = QJniObject::getStaticObjectField<jstring>(clazz, "FIELD_NAME");
[static]
QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)
className 클래스에서 signature 을 사용하여 fieldName 필드에서 JNI 객체를 검색합니다.
참고: 이 함수는 템플릿 유형 없이 사용할 수 있습니다.
QJniObject jobj = QJniObject::getStaticObjectField("class/with/Fields", "FIELD_NAME", "Ljava/lang/String;");
[static]
QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName, const char *signature)
clazz 클래스에서 signature 을 사용하여 fieldName 필드에서 JNI 객체를 검색합니다.
참고: 이 함수는 템플릿 유형 없이 사용할 수 있습니다.
QJniObject jobj = QJniObject::getStaticObjectField(clazz, "FIELD_NAME", "Ljava/lang/String;");
[static]
bool QJniObject::isClassAvailable(const char *className)
Java 클래스 className 를 사용할 수 있으면 true를 반환합니다.
if (QJniObject::isClassAvailable("java/lang/String")) { // condition statement }
bool QJniObject::isValid() const
이 인스턴스가 유효한 Java 객체를 보유하고 있으면 true를 반환합니다.
QJniObject qjniObject; // ==> isValid() == false QJniObject qjniObject(0) // ==> isValid() == false QJniObject qjniObject("could/not/find/Class") // ==> isValid() == false
[since 6.2]
jclass QJniObject::objectClass() const
QJniObject 가 보유한 클래스 객체를 jclass
로 반환합니다.
참고: 반환된 객체는 이 QJniObject 에 의해 계속 살아있게 유지됩니다. 예를 들어 나중에 사용하기 위해 기록하기 위해 이 QJniObject 의 수명 이후에도 객체를 유지하려면 가장 쉬운 방법은 적절한 수명을 가진 다른 QJniObject 에 저장하는 것입니다. 또는 객체에 대한 새로운 전역 참조를 생성하여 저장한 후 작업이 끝나면 해제하도록 주의할 수 있습니다.
이 기능은 Qt 6.2에 도입되었습니다.
template <typename T> void QJniObject::setField(const char *fieldName, T value)
fieldName 의 값을 value 으로 설정합니다.
QJniObject obj; obj.setField<jint>("AN_INT_FIELD", 10); jstring myString = ...; obj.setField<jstring>("A_STRING_FIELD", myString);
template <typename T> void QJniObject::setField(const char *fieldName, const char *signature, T value)
signature 으로 fieldName 의 값을 value 로 설정합니다.
QJniObject stringArray = ...; QJniObject obj = ...; obj.setObjectField<jobjectArray>("KEY_VALUES", "([Ljava/lang/String;)V", stringArray.object<jobjectArray>())
[static]
template <typename Klass, typename T> auto QJniObject::setStaticField(const char *fieldName, T value)
Klass
클래스의 정적 필드 fieldName 를 value 로 설정합니다.
Klass
Java 타입에 등록된 타입 매핑이 있는 C++ 타입이어야 합니다.
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, T value)
className 클래스의 정적 필드 fieldName 를 value 로 설정합니다.
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, T value)
clazz 클래스의 정적 필드 fieldName 를 value 로 설정합니다.
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, T value)
signature 와 함께 세터를 사용하여 className 클래스의 정적 필드 fieldName 를 value 로 설정합니다.
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, T value)
signature 와 함께 세터를 사용하여 clazz 클래스의 정적 필드 fieldName 를 value 로 설정합니다.
[noexcept, since 6.8]
void QJniObject::swap(QJniObject &other)
이 객체를 other 로 바꿉니다. 이 작업은 매우 빠르며 실패하지 않습니다.
이 함수는 Qt 6.8에 도입되었습니다.
QString QJniObject::toString() const
자바 객체의 문자열 표현으로 QString 을 반환합니다. Java 문자열 객체에서 이 함수를 호출하면 실제 문자열 데이터를 편리하게 가져올 수 있습니다.
QJniObject string = ...; // "Hello Java" QString qstring = string.toString(); // "Hello Java"
fromString()도 참조하세요 .
template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)
현재 객체를 object 로 바꿉니다. 이전 Java 객체가 릴리스됩니다.
관련 비회원
bool operator!=(const QJniObject &o1, const QJniObject &o2)
o1 에 o2 과 다른 객체에 대한 참조가 있는 경우 true를 반환합니다.
bool operator==(const QJniObject &o1, const QJniObject &o2)
o1 와 o2, 두 객체 모두 동일한 Java 객체를 참조하거나 둘 다 NULL인 경우 참을 반환합니다. 그 외의 경우에는 false가 반환됩니다.
© 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.