QJniEnvironment 类
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 |
公共类型
枚举类 | OutputMode { Silent, Verbose } |
公共函数
QJniEnvironment() | |
~QJniEnvironment() | |
bool | checkAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose) |
jclass | findClass(const char *className) |
(since 6.2) jfieldID | findField(jclass clazz, const char *fieldName, const char *signature) |
(since 6.4) jfieldID | findField(jclass clazz, const char *fieldName) |
(since 6.2) jmethodID | findMethod(jclass clazz, const char *methodName, const char *signature) |
(since 6.4) jmethodID | findMethod(jclass clazz, const char *methodName) |
(since 6.2) jfieldID | findStaticField(jclass clazz, const char *fieldName, const char *signature) |
(since 6.4) jfieldID | findStaticField(jclass clazz, const char *fieldName) |
(since 6.2) jmethodID | findStaticMethod(jclass clazz, const char *methodName, const char *signature) |
(since 6.4) jmethodID | findStaticMethod(jclass clazz, const char *methodName) |
(since 6.2) bool | isValid() const |
JNIEnv * | jniEnv() const |
bool | registerNativeMethods(const char *className, const JNINativeMethod[] methods, int size) |
bool | registerNativeMethods(jclass clazz, const JNINativeMethod[] methods, int size) |
bool | registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods) |
bool | registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods) |
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::Silent | 0 | 异常无声清理 |
QJniEnvironment::OutputMode::Verbose | 1 | 将异常及其堆栈跟踪打印为错误到 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 的成员字段。字段由其 fieldName 和 signature 指定。
如果找到该字段,则返回字段 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 的实例方法。方法由其 methodName 和 signature 指定。
如果找到了方法,则返回方法 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 的静态字段。字段由其 fieldName 和 signature 指定。
如果找到该字段,则返回字段 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。方法通过其 methodName 和 signature 指定。
如果找到了方法,则返回方法 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)
注册大小为 size 的 methods 数组中的 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. 在芬兰以及全球其他国家的商标。所有其他商标均为各自所有者的财产。