이 페이지에서

QtJniTypes Namespace

QtJniTypes 네임스페이스는 Java 유형에 해당하는 C++ 유형을 선언합니다. 더 보기...

헤더: #include <QtJniTypes>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
다음부터: Qt 6.8부터

클래스

(since Qt 6.8) class JObject

매크로

(since 6.8) Q_DECLARE_JNI_CLASS(Type, JavaSignature)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)
(since 6.8) Q_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

상세 설명

Java Native Interface (JNI) 프레임워크는 네이티브 C 또는 C++ 코드가 Java API를 호출할 수 있도록 하고, Java 코드가 JVM을 통해 호출할 수 있도록 네이티브 C 또는 C++ 함수를 등록할 수 있게 해줍니다. Qt에서는 ` QJniObject ` 및 ` QJniEnvironment ` 유형이 JNI를 사용하기 위한 편리한 래퍼를 제공합니다.

C++과 마찬가지로 Java 언어에서도 오버로딩을 지원하기 때문에, 함수는 전체 시그니처 문자열을 포함하여 지정해야 합니다. 이는 특히 함수가 여러 매개변수를 받는 경우 복잡하고, 반복적이며, 오류가 발생하기 쉽습니다. QJniObject 는 템플릿으로 전달된 C++ 유형을 기반으로 컴파일 시점에 함수 호출의 시그니처 문자열을 추론할 수 있는 가변 매개변수 템플릿 API를 제공합니다. 이 기능이 작동하려면 컴파일 시점에 해당 C++ 타입과 이에 대응하는 JNI 문자열 간의 매핑을 알고 있어야 합니다.

Qt는 표준 JNI types 에 대해 이 매핑을 구현합니다. Q_DECLARE_JNI_CLASS 매크로를 사용하면 임의의 Java 유형에 대해 이 매핑을 확장할 수 있습니다.

Q_DECLARE_JNI_CLASS, Q_DECLARE_JNI_NATIVE_METHOD 및 Q_JNI_NATIVE_METHOD도 참조하십시오 .

클래스

JObject 클래스

QtJniTypes 네임스페이스의 JObject 템플릿은 선언된 Java 유형의 기반이 됩니다. 더 보기...

매크로 문서

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

QtJniTypes 네임스페이스 내에 Java 클래스 JavaSignature 를 래핑하는 C++ 타입 Type 를 선언합니다. JavaSignature 에 명시된 Java 클래스 이름은 / 를 구분자로 사용하여 완전한 정규화된 이름을 사용해야 합니다.

Q_DECLARE_JNI_CLASS(File, "java/io/File")
Q_DECLARE_JNI_CLASS(FileWriter, "java/io/FileWriter")

따라서 C++ 클래스 QtJniTypes::File 및 QtJniTypes::FileWriter 은 QJniObject 과 유사한 유형(정확히 말하면 QtJniTypes::JObject 의 특화형)으로, 해당 Java 클래스를 인스턴스화하고, 메서드를 호출하며, 컴파일 시점의 자동 시그니처 추론을 통해 QJniObject 가변 인자 템플릿 메서드를 통해 이러한 인스턴스를 전달하는 데 사용할 수 있습니다.

using namespace QtJniTypes;

File file("path/to/file"); // instantiates the java.io.File type in Java
if (file.callMethod<bool>("createNewFile")) {
    FileWriter writer(file); // instantiates a java.io.FileWriter that operates on file
    writer.callMethod("write", 42);
}

QJniObject API 외에도, 이러한 C++ 클래스에는 다음과 같이 사용할 수 있는 정적 registerNativeMethods 멤버 함수가 있습니다:

QtJniTypes::File::registerNativeMethods({
    Q_JNI_NATIVE_METHOD(freeFunction)
});

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_DECLARE_JNI_NATIVE_METHOD, Q_JNI_NATIVE_METHOD 및 QtJniTypes::JObject도 참조하십시오 .

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method)

Method 라는 자유 C 또는 C++ 함수를 네이티브 메서드로 선언합니다. 이 메서드는 나중에 ` Q_JNI_NATIVE_METHOD ` 매크로를 활용하여 `QJniEnvironment::registerNativeMethod()`를 통해 JNI 프레임워크에 등록할 수 있습니다.

// 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);
}

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_JNI_NATIVE_METHOD 및 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE도 참조하십시오 .

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)

C 또는 C++의 자유 함수 Method 를 Java에서 JavaName 로 사용할 수 있는 네이티브 메서드로 선언합니다. 이 메서드는 나중에 Q_JNI_NATIVE_METHOD 매크로를 활용하여 QJniEnvironment::registerNativeMethod()를 통해 JNI 프레임워크에 등록할 수 있습니다.

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

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_JNI_NATIVE_METHOD 및 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE도 참조하십시오 .

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)

C++의 정적 클래스 멤버 함수 ` Method `를 네이티브 메서드로 선언합니다. 이 메서드는 나중에 ` Q_JNI_NATIVE_SCOPED_METHOD ` 매크로를 사용하여 `QJniEnvironment::registerNativeMethod()`를 통해 JNI 프레임워크에 등록할 수 있습니다.

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)
});

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_DECLARE_JNI_NATIVE_METHOD 및 Q_JNI_NATIVE_SCOPED_METHOD도 참조하십시오 .

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)

C++의 정적 클래스 멤버 함수 ` Method `를 Java에서 ` JavaName`로 사용할 수 있는 네이티브 메서드로 선언합니다. 이 메서드는 나중에 ` Q_JNI_NATIVE_METHOD ` 매크로를 활용하여 `QJniEnvironment::registerNativeMethod()`를 통해 JNI 프레임워크에 등록할 수 있습니다.

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

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_DECLARE_JNI_NATIVE_METHOD 및 Q_JNI_NATIVE_SCOPED_METHOD도 참조하십시오 .

[since 6.8] Q_JNI_NATIVE_METHOD(Method)

이전에는 declared 에 있던 네이티브 메서드 Method 를 JNI 프레임워크에 등록할 수 있도록 합니다. QJniEnvironment::registerNativeMethod()를 사용하여 JNI에 메서드를 등록할 때 이 매크로를 사용하십시오.

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

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_DECLARE_JNI_NATIVE_METHOD도 참조하십시오 .

[since 6.8] Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

이전에는 declared 에 있던 네이티브 메서드 Method (범위: Scope )를 JNI 프레임워크에 등록할 수 있도록 합니다. QJniEnvironment::registerNativeMethod()를 사용하여 JNI에 메서드를 등록할 때 이 매크로를 사용하십시오.

이 매크로는 Qt 6.8에서 도입되었습니다.

Q_JNI_NATIVE_METHOD 및 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE도 참조하십시오 .

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