QJniEnvironment 类

QJniEnvironment 类提供了对 JNI 环境的访问 (JNIEnv)。 更多...

头文件 #include <QJniEnvironment>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.1

公共类型

枚举类OutputMode { Silent, Verbose }

公共函数

QJniEnvironment()
~QJniEnvironment()
boolcheckAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)
jclassfindClass(const char *className)
(since 6.2) jfieldIDfindField(jclass clazz, const char *fieldName, const char *signature)
(since 6.4) jfieldIDfindField(jclass clazz, const char *fieldName)
(since 6.2) jmethodIDfindMethod(jclass clazz, const char *methodName, const char *signature)
(since 6.4) jmethodIDfindMethod(jclass clazz, const char *methodName)
(since 6.2) jfieldIDfindStaticField(jclass clazz, const char *fieldName, const char *signature)
(since 6.4) jfieldIDfindStaticField(jclass clazz, const char *fieldName)
(since 6.2) jmethodIDfindStaticMethod(jclass clazz, const char *methodName, const char *signature)
(since 6.4) jmethodIDfindStaticMethod(jclass clazz, const char *methodName)
(since 6.2) boolisValid() const
JNIEnv *jniEnv() const
boolregisterNativeMethods(const char *className, const JNINativeMethod[] methods, int size)
boolregisterNativeMethods(jclass clazz, const JNINativeMethod[] methods, int size)
boolregisterNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)
boolregisterNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
JNIEnv &operator*() const
JNIEnv *operator->() const

静态公共成员

boolcheckAndClearExceptions(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。在Android上的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>());

注意:此调用返回一个全局引用到内部缓存的类对象。

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

搜索类 clazz 的成员字段。字段由其 fieldNamesignature 指定。

如果找到该字段,则返回字段 ID 或 nullptr

此方法的一个用例是搜索类字段并缓存它们的 ID,以便稍后用于获取/设置字段。

此函数是在 Qt 6.2 中引入的。

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

搜索类 clazz 的成员字段。字段由其 fieldName 指定,字段的签名从模板参数中推断。

如果找到该字段,则返回字段 ID 或 nullptr

此函数是在 Qt 6.4 中引入的。

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

搜索类 clazz 的实例方法。方法由其 methodNamesignature 指定。

如果找到了方法,则返回方法 ID 或 nullptr

此方法的一个用例是搜索类方法并缓存它们的 ID,以便稍后调用方法。

此函数是在 Qt 6.2 中引入的。

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

搜索类 clazz 的实例方法。方法由其 methodName 指定,签名从模板参数中推断。

如果找到了方法,则返回方法 ID 或 nullptr

此函数是在 Qt 6.4 中引入的。

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

搜索类 clazz 的静态字段。字段由其 fieldNamesignature 指定。

如果找到该字段,则返回字段 ID 或 nullptr

此方法的一个用例是搜索类字段并缓存它们的 ID,以便稍后用于获取/设置字段。

此函数是在 Qt 6.2 中引入的。

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

搜索类 clazz 的静态字段。字段由其 fieldName 指定,字段的签名从模板参数中推断。

如果找到该字段,则返回字段 ID 或 nullptr

此函数是在 Qt 6.4 中引入的。

[自 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 中引入的。

[自 6.4] 模板 <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 中引入的。

[静态] JNIEnv *QJniEnvironment::getJniEnv()

返回当前线程的 JNIEnv 指针。

当前线程将被连接到 Java 虚拟机。

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

如果此实例持有有效的 JNIEnv 对象,则返回 true

此函数是在 Qt 6.2 中引入的。

[静态] JavaVM *QJniEnvironment::javaVM()

返回当前进程的 Java 虚拟机接口。尽管每个进程可能有多个 Java 虚拟机,但 Android 只允许一个。

JNIEnv *QJniEnvironment::jniEnv() const

返回 JNI 环境的 JNIEnv 指针。

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

注册大小为 sizemethods 数组中的 Java 方法,这些方法可以调用来自类 className 的原生 C++ 函数。必须在尝试调用它们之前注册这些方法。

如果注册成功,返回 true,否则返回 false

methods 数组中的每个元素由以下内容组成

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

bool QJniEnvironment::registerNativeMethods(jclass clazz, 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

JNIEnv &QJniEnvironment::operator*() const

返回 JNI 环境的 JNIEnv 对象。

JNIEnv *QJniEnvironment::operator->() const

提供访问 JNI 环境的 JNIEnv 指针。

© 2024 The Qt Company Ltd. 本文档贡献者的文档版权归各自所有者。此处提供的文档在 Free Software Foundation 发布的 GNU 自由文档许可证版本 1.3 的条款下提供。Qt 和相关标志是 The Qt Company Ltd. 在芬兰以及全球其他国家的商标。所有其他商标均为各自所有者的财产。