本页内容

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 本机接口(JNI)框架允许本机 C 或 C++ 代码调用 Java API,并注册本机 C 或 C++ 函数,以便 Java 代码能够通过 JVM 调用这些函数。在 Qt 中,QJniObject 和QJniEnvironment 类型为使用 JNI 提供了便捷的封装。

由于 Java 语言与 C++ 类似,支持重载,因此需要指定包含完整签名字符串的函数。这既复杂又重复,且容易出错,尤其是当函数接受多个参数时。QJniObject 提供了可变参数模板 API,能够基于传递给模板的 C++ 类型,在编译时推导出函数调用的签名字符串。 要使此功能正常工作,必须在编译时已知这些 C++ 类型与其对应的 JNI 字符串之间的映射关系。

Qt XML 为标准的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 命名空间中声明一个C++类型Type ,该类型封装了Java类JavaSignature 。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)

将自由的 C 或 C++ 函数 `Method ` 声明为原生方法。随后,可以借助 `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.