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 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框架使本地 C 或 C++ 代码能够调用 Java API,并注册 Java 代码应能在 JVM 中调用的本地 C 或 C++ 函数。在 Qt XML 中,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 。
宏文档
[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 的类型,可用于实例化相应的 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 。
[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)
使作用域Scope 中先前的declared 本地方法Method 可在 JNI 框架中注册。在使用 QJniEnvironment::registerNativeMethod() 向 JNI 注册方法时使用此宏。
此宏在 Qt 6.8 中引入。
另请参阅 Q_JNI_NATIVE_METHOD 和Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE 。
© 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.