QJniEnvironment Class

QJniEnvironment 클래스는 JNI 환경(JNIEnv)에 대한 액세스를 제공합니다. 더 보기...

헤더: #include <QJniEnvironment>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
이후: Qt 6.1

공용 형

enum class OutputMode { Silent, Verbose }

공용 함수

QJniEnvironment()
~QJniEnvironment()
bool checkAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)
jclass findClass(const char *className)
(since 6.4) jfieldID findField(jclass clazz, const char *fieldName)
(since 6.2) jfieldID findField(jclass clazz, const char *fieldName, const char *signature)
(since 6.4) jmethodID findMethod(jclass clazz, const char *methodName)
(since 6.2) jmethodID findMethod(jclass clazz, const char *methodName, const char *signature)
(since 6.4) jfieldID findStaticField(jclass clazz, const char *fieldName)
(since 6.2) jfieldID findStaticField(jclass clazz, const char *fieldName, const char *signature)
(since 6.4) jmethodID findStaticMethod(jclass clazz, const char *methodName)
(since 6.2) jmethodID findStaticMethod(jclass clazz, const char *methodName, const char *signature)
(since 6.2) bool isValid() const
JNIEnv *jniEnv() const
bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
bool registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)
bool registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
bool registerNativeMethods(const char *className, const JNINativeMethod[] methods, int size)
bool registerNativeMethods(jclass clazz, const JNINativeMethod[] methods, int size)
JNIEnv &operator*() const
JNIEnv *operator->() const

정적 공용 멤버

bool checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)
JNIEnv *getJniEnv()
JavaVM *javaVM()

상세 설명

JNI를 사용할 때 JNIEnv 클래스는 함수 테이블에 대한 포인터와 테이블을 통해 지시하는 각 JNI 함수에 대한 멤버 함수입니다. JNIEnv 는 대부분의 JNI 함수를 제공합니다. 모든 C++ 네이티브 함수는 첫 번째 인자로 JNIEnv 을 받습니다. JNI 환경은 스레드 간에 공유할 수 없습니다.

JNIEnv 는 예외 검사 및 지우기와 같은 오류 검사를 많이 수행하지 않으므로 QJniEnvironment를 사용하면 이를 쉽게 수행할 수 있습니다.

JNIEnv에 대한 자세한 내용은 Java: 인터페이스 기능 표를 참조하세요.

참고: 이 API는 Android에서 사용하도록 설계 및 테스트되었습니다. 다른 플랫폼에서는 테스트되지 않았습니다.

멤버 유형 문서

enum class QJniEnvironment::OutputMode

상수설명
QJniEnvironment::OutputMode::Silent0예외가 자동으로 정리됩니다.
QJniEnvironment::OutputMode::Verbose1예외와 해당 스택 백트레이스를 오류로 stderr 스트림에 출력합니다.

멤버 함수 문서

QJniEnvironment::QJniEnvironment()

새 JNI 환경 객체를 생성하고 현재 스레드를 Java VM에 연결합니다.

[noexcept] QJniEnvironment::~QJniEnvironment()

Java VM에서 현재 스레드를 분리하고 QJniEnvironment 객체를 삭제합니다. 그러면 checkAndClearExceptions()를 호출하여 보류 중인 예외가 모두 지워집니다.

bool QJniEnvironment::checkAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)

outputMode에 따라 보류 중인 모든 예외를 자동으로 또는 스택 백트레이스를 보고하여 정리합니다.

내부적으로 예외를 처리하는 QJniObject 과 달리 JNIEnv 을 통해 직접 JNI 호출을 하는 경우 이 함수를 사용하여 호출 후 잠재적인 예외를 모두 지워야 합니다. 예외를 발생시킬 수 있는 JNIEnv 호출에 대한 자세한 내용은 JNI 함수를 참조하세요.

보류 중인 예외가 지워지면 true 을 반환합니다.

[static] bool QJniEnvironment::checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)

outputMode 에 따라 자동으로 또는 스택 백트레이스 보고를 통해 env 에 대한 보류 중인 예외를 모두 지웁니다. 네이티브 함수 구현에서와 같이 JNIEnv 포인터가 이미 있는 경우에 유용합니다.

내부적으로 예외를 처리하는 QJniObject 과 달리 JNIEnv 을 통해 직접 JNI 호출을 하는 경우 이 함수를 사용하여 호출 후 잠재적인 예외를 모두 지워야 합니다. 예외를 발생시킬 수 있는 JNIEnv 호출에 대한 자세한 내용은 JNI 함수를 참조하세요.

보류 중인 예외가 지워지면 true 을 반환합니다.

jclass QJniEnvironment::findClass(const char *className)

사용 가능한 모든 클래스 로더를 사용하여 className 를 검색합니다. 안드로이드의 Qt는 사용자 정의 클래스 로더를 사용하여 모든 .jar 파일을 로드하며, 기본 클래스 로더를 사용할 때는 이러한 클래스가 표시되지 않으므로 해당 클래스 로더에서 생성된 클래스를 찾으려면 해당 클래스 로더를 사용해야 합니다.

className 을 찾을 수 없는 경우 클래스 포인터를 반환하거나 null을 반환합니다.

이 함수의 사용 사례는 jclass 를 받는 JNI 메서드를 호출할 클래스를 검색하는 것입니다. 이 함수는 동일한 클래스 객체에 대해 여러 개의 JNI 호출을 수행할 때 유용할 수 있으며, 각 호출에서 클래스 이름을 사용하는 것보다 조금 더 빠를 수 있습니다. 또한 이 호출은 JNI 호출을 수행하기 전에 내부적으로 캐시된 클래스를 먼저 찾고 해당 클래스가 있는 경우 반환합니다. 다음 코드 스니펫은 CustomClass 클래스의 인스턴스를 만든 다음 printFromJava() 메서드를 호출합니다:

QJniEnvironment env;
jclass javaClass = env.findClass("org/qtproject/example/android/CustomClass");
QJniObject javaMessage = QJniObject::fromString("findClass example");
QJniObject::callStaticMethod<void>(javaClass, "printFromJava",
                                   "(Ljava/lang/String;)V", javaMessage.object<jstring>());

참고: 이 호출은 내부적으로 캐시된 클래스에서 클래스 객체에 대한 전역 참조를 반환합니다.

[since 6.4] template <typename T> jfieldID QJniEnvironment::findField(jclass clazz, const char *fieldName)

클래스의 멤버 필드를 검색합니다 clazz. 필드는 fieldName 로 지정됩니다. 필드의 서명은 템플릿 매개변수에서 추론됩니다.

필드 ID를 반환하거나 필드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 함수는 Qt 6.4에 도입되었습니다.

[since 6.2] jfieldID QJniEnvironment::findField(jclass clazz, const char *fieldName, const char *signature)

클래스의 멤버 필드를 검색합니다 clazz. 필드는 fieldNamesignature 으로 지정됩니다.

필드 ID를 반환하거나 필드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 메서드의 사용 사례는 클래스 필드를 검색하고 해당 필드 ID를 캐싱하여 나중에 필드를 가져오거나 설정하는 데 사용할 수 있도록 하는 것입니다.

이 함수는 Qt 6.2에 도입되었습니다.

[since 6.4] template <typename... Args> jmethodID QJniEnvironment::findMethod(jclass clazz, const char *methodName)

클래스의 인스턴스 메서드를 검색합니다 clazz. 메서드는 methodName 로 지정되며 서명은 템플릿 매개변수에서 추론됩니다.

메서드를 찾을 수 없으면 메서드 ID를 반환하고, 메서드를 찾을 수 없으면 nullptr 을 반환합니다.

이 함수는 Qt 6.4에 도입되었습니다.

[since 6.2] jmethodID QJniEnvironment::findMethod(jclass clazz, const char *methodName, const char *signature)

클래스의 인스턴스 메서드를 검색합니다 clazz. 메서드는 methodNamesignature 로 지정됩니다.

메서드 ID를 반환하거나 메서드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 메서드의 사용 사례는 클래스 메서드를 검색하고 그 ID를 캐싱하여 나중에 메서드를 호출할 때 사용할 수 있도록 하는 것입니다.

이 함수는 Qt 6.2에 도입되었습니다.

[since 6.4] template <typename T> jfieldID QJniEnvironment::findStaticField(jclass clazz, const char *fieldName)

클래스의 정적 필드를 검색합니다 clazz. 필드는 fieldName 로 지정됩니다. 필드의 서명은 템플릿 매개변수에서 추론됩니다.

필드 ID를 반환하거나 필드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 함수는 Qt 6.4에 도입되었습니다.

[since 6.2] jfieldID QJniEnvironment::findStaticField(jclass clazz, const char *fieldName, const char *signature)

클래스의 정적 필드를 검색합니다 clazz. 필드는 fieldNamesignature 으로 지정됩니다.

필드 ID를 반환하거나 필드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 메서드의 사용 사례는 클래스 필드를 검색하고 해당 필드의 ID를 캐싱하여 나중에 필드를 가져오거나 설정하는 데 사용할 수 있도록 하는 것입니다.

이 함수는 Qt 6.2에 도입되었습니다.

[since 6.4] template <typename... Args> jmethodID QJniEnvironment::findStaticMethod(jclass clazz, const char *methodName)

클래스의 인스턴스 메서드를 검색합니다 clazz. 메서드는 methodName 로 지정되며 서명은 템플릿 매개변수에서 추론됩니다.

메서드를 찾을 수 없으면 메서드 ID를 반환하고, 메서드를 찾을 수 없으면 nullptr 을 반환합니다.

QJniEnvironment env;
jclass javaClass = env.findClass("org/qtproject/example/android/CustomClass");
jmethodID methodId = env.findStaticMethod<void, jstring>(javaClass, "staticJavaMethod");
QJniObject javaMessage = QJniObject::fromString("findStaticMethod example");
QJniObject::callStaticMethod<void>(javaClass,
                                   methodId,
                                   javaMessage.object<jstring>());

이 함수는 Qt 6.4에 도입되었습니다.

[since 6.2] jmethodID QJniEnvironment::findStaticMethod(jclass clazz, const char *methodName, const char *signature)

클래스의 정적 메서드를 검색합니다 clazz. 메서드는 methodNamesignature 로 지정됩니다.

메서드 ID를 반환하거나 메서드를 찾을 수 없는 경우 nullptr 를 반환합니다.

이 메서드의 사용 사례는 클래스 메서드를 검색하고 그 ID를 캐시하여 나중에 메서드를 호출할 때 사용할 수 있도록 하는 것입니다.

QJniEnvironment env;
jclass javaClass = env.findClass("org/qtproject/example/android/CustomClass");
jmethodID methodId = env.findStaticMethod(javaClass,
                                          "staticJavaMethod",
                                          "(Ljava/lang/String;)V");
QJniObject javaMessage = QJniObject::fromString("findStaticMethod example");
QJniObject::callStaticMethod<void>(javaClass,
                                   methodId,
                                   javaMessage.object<jstring>());

이 함수는 Qt 6.2에 도입되었습니다.

[static] JNIEnv *QJniEnvironment::getJniEnv()

현재 스레드에 대한 JNIEnv 포인터를 반환합니다.

현재 스레드가 Java VM에 연결됩니다.

[since 6.2] bool QJniEnvironment::isValid() const

이 인스턴스가 유효한 JNIEnv 객체를 보유하면 true 를 반환합니다.

이 함수는 Qt 6.2에 도입되었습니다.

[static] JavaVM *QJniEnvironment::javaVM()

현재 프로세스에 대한 Java VM 인터페이스를 반환합니다. 프로세스당 여러 개의 Java VM을 가질 수 있지만 Android에서는 하나만 허용합니다.

JNIEnv *QJniEnvironment::jniEnv() const

JNI 환경의 JNIEnv 포인터를 반환합니다.

template <typename Class> bool QJniEnvironment::registerNativeMethods(std::initializer_list<JNINativeMethod> methods)

이 함수는 오버로드된 함수입니다.

Class 로 표시되는 Java 클래스에 methods 의 Java 메서드를 등록하고 등록 성공 여부를 반환합니다.

Class 유형은 QtJniTypes 네임스페이스 내에서 Q_DECLARE_JNI_CLASS 매크로를 사용하여 선언해야 합니다. 자유 C 또는 C++ 함수로 구현된 함수는 Q_DECLARE_JNI_NATIVE_METHOD 매크로 중 하나를 사용하여 선언하고 Q_JNI_NATIVE_METHOD 매크로를 사용하여 등록에 전달해야 합니다.

// C++ side

Q_DECLARE_JNI_CLASS(MyJavaType, "my/java/Type")

static void nativeFunction(JNIEnv *env, jobject thiz, jlong id)
{
    // ...
}
Q_DECLARE_JNI_NATIVE_METHOD(nativeFunction)

Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    QJniEnvironment env;
    env.registerNativeMethods<QtJniTypes::MyJavaType>({
        Q_JNI_NATIVE_METHOD(nativeFunction)
    });
}

// Java side
public class MyJavaType
{
    native public nativeFunction(long id);
}

정적 클래스 멤버 함수로 구현된 함수의 경우 macros for scoped functions 매크로를 대신 사용하세요.

class NativeHandler
{
    // ...
private:
    static void handleChange(JNIEnv*, jobject, jlong id);
    Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(handleChange)
};

\dots
QJniEnvironment env;
env.registerNativeMethods<QtJniTypes::MyJavaType>({
    Q_JNI_NATIVE_SCOPED_METHOD(handleChange, NativeHandler)
});

bool QJniEnvironment::registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)

이것은 오버로드된 함수입니다.

Java 클래스 className 에 대한 네이티브 함수 메서드를 methods 에 등록합니다. 등록에 성공하면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

bool QJniEnvironment::registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)

이것은 오버로드된 함수입니다.

Java 클래스 clazz 에 대한 네이티브 함수 메서드를 methods 에 등록합니다. 등록에 성공하면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

bool QJniEnvironment::registerNativeMethods(const char *className, const JNINativeMethod[] methods, int size)

이것은 오버로드된 함수입니다.

size 크기의 배열 methods 에 Java 메서드를 등록하고, 각 메서드는 className 클래스에서 네이티브 C++ 함수를 호출할 수 있습니다. 이러한 메서드는 호출을 시도하기 전에 등록해야 합니다.

등록에 성공하면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

메소드 배열의 각 요소는 다음과 같이 구성됩니다:

  • Java 메서드 이름
  • 메서드 서명
  • 실행될 C++ 함수
const JNINativeMethod methods[] =
                        {{"callNativeOne", "(I)V", reinterpret_cast<void *>(fromJavaOne)},
                        {"callNativeTwo", "(I)V", reinterpret_cast<void *>(fromJavaTwo)}};
QJniEnvironment env;
env.registerNativeMethods("org/qtproject/android/TestJavaClass", methods, 2);

bool QJniEnvironment::registerNativeMethods(jclass clazz, const JNINativeMethod[] methods, int size)

이것은 오버로드된 함수입니다.

이 오버로드는 이전에 캐시된 jclass 인스턴스 clazz 를 사용합니다.

JNINativeMethod methods[] {{"callNativeOne", "(I)V", reinterpret_cast<void *>(fromJavaOne)},
                           {"callNativeTwo", "(I)V", reinterpret_cast<void *>(fromJavaTwo)}};
QJniEnvironment env;
jclass clazz = env.findClass("org/qtproject/android/TestJavaClass");
env.registerNativeMethods(clazz, methods, 2);

JNIEnv &QJniEnvironment::operator*() const

JNI 환경의 JNIEnv 객체를 반환합니다.

JNIEnv *QJniEnvironment::operator->() const

JNI 환경의 JNIEnv 포인터에 대한 액세스를 제공합니다.

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