Spec-Zone.ru › Qt

Класс QJniEnvironment

Класс QJniEnvironment предоставляет доступ к среде JNI (JNIEnv). Подробнее...

Заголовок: #include <QJniEnvironment>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С тех пор: Qt 6.1
  • Список всех членов, включая унаследованные члены
  • Устаревшие члены

Типы public

Перечисление OutputMode { Silent, Verbose }

Функции public

QJniEnvironment()
~QJniEnvironment()
bool checkAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)
jclass findClass(const char *className)
jfieldID findField(jclass clazz, const char *fieldName, const char *signature)
jmethodID findMethod(jclass clazz, const char *methodName, const char *signature)
jfieldID findStaticField(jclass clazz, const char *fieldName, const char *signature)
jmethodID findStaticMethod(jclass clazz, const char *methodName, const char *signature)
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)
JNIEnv & operator*() const
JNIEnv * operator->() const

Статические public члены

bool checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)
JavaVM * javaVM()

Подробное описание

При использовании JNI, класс JNIEnv представляет собой указатель на таблицу функций и функцию-член для каждой функции JNI, которая опосредовано обращается к таблице. JNIEnv предоставляет большинство функций JNI. Каждая функция C++ получает JNIEnv в качестве первого аргумента. Среда JNI не может быть разделена между потоками.

Поскольку JNIEnv не выполняет много проверок ошибок, таких как проверка и очистка исключений, QJniEnvironment позволяет легко это сделать.

Дополнительную информацию о JNIEnv см. в Java: Interface Function Table.

Примечание: Этот API разработан и протестирован для использования с Android. Он не тестировался для других платформ.

Документация по типам членов

Перечисление QJniEnvironment::OutputMode

Константа Значение Описание
QJniEnvironment::OutputMode::Silent 0 Исключения очищаются без сообщений.
QJniEnvironment::OutputMode::Verbose 1 Выводит исключения и их стек-трейсы как ошибку в поток stderr.

Документация по функциям-членам

QJniEnvironment::QJniEnvironment()

Создает новый объект JNI Environment и присоединяет текущий поток к Java VM.

QJniEnvironment::~QJniEnvironment()

Отсоединяет текущий поток от Java VM и уничтожает объект QJniEnvironment. Это очистит любое ожидающее исключение, вызвав checkAndClearExceptions().

bool QJniEnvironment::checkAndClearExceptions(QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)

Очищает любые ожидающие исключения, либо без сообщений, либо с выводом стек-трейса, в зависимости от outputMode.

В отличие от QJniObject, который обрабатывает исключения внутренне, если вы вызываете функции JNI напрямую через JNIEnv, вам необходимо очистить любые потенциальные исключения после вызова с помощью этой функции. Дополнительную информацию об вызовах JNIEnv, которые могут вызвать исключение, см. в JNI Functions.

Возвращает true, когда ожидающее исключение было очищено.

bool QJniEnvironment::checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode = OutputMode::Verbose)

Очищает любые ожидающие исключения для env, либо без сообщений, либо с выводом стек-трейса, в зависимости от outputMode. Это полезно, когда у вас уже есть указатель JNIEnv , например, в реализации нативной функции.

В отличие от QJniObject, который обрабатывает исключения внутренне, если вы вызываете функции JNI напрямую через JNIEnv, вам необходимо очистить любые потенциальные исключения после вызова с помощью этой функции. Дополнительную информацию об вызовах JNIEnv, которые могут вызвать исключение, см. в JNI Functions.

Возвращает true, когда ожидающее исключение было очищено.

jclass QJniEnvironment::findClass(const char *className)

Ищет className, используя все доступные загрузчики классов. Qt на Android использует пользовательский загрузчик классов для загрузки всех файлов .jar, и его необходимо использовать для поиска любых классов, созданных этим загрузчиком, поскольку эти классы не видны при использовании стандартного загрузчика классов.

Возвращает указатель на класс или null, если className не найден.

Пример использования этой функции — поиск класса для вызова метода JNI, принимающего jclass. Это может быть полезно при многократных вызовах 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>());

Примечание: Этот вызов возвращает глобальную ссылку на объект класса из кэшированных классов.

jfieldID QJniEnvironment::findField(jclass clazz, const char *fieldName, const char *signature)

Ищет поле-член класса clazz. Поле определяется по имени fieldName и подписи signature.

Возвращает идентификатор поля или nullptr, если поле не найдено.

Случаи использования для этого метода — поиск полей класса и кэширование их идентификаторов, чтобы они могли впоследствии использоваться для получения/установки значений полей.

Функция была добавлена в Qt 6.2.

jmethodID QJniEnvironment::findMethod(jclass clazz, const char *methodName, const char *signature)

Ищет метод-член класса clazz. Метод определяется по имени methodName и подписи signature.

Возвращает идентификатор метода или nullptr, если метод не найден.

Пример использования этого метода — поиск методов класса и кэширование их идентификаторов, чтобы они могли использоваться для вызова методов позже.

Эта функция была представлена в Qt 6.2.

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

Ищет статическое поле класса clazz. Поле задаётся его именем fieldName и подписью signature.

Возвращает идентификатор поля или nullptr, если поле не найдено.

Пример использования этого метода — поиск полей класса и кэширование их идентификаторов, чтобы они могли использоваться для получения/установки полей позже.

Эта функция была представлена в Qt 6.2.

[since 6.2] jmethodID QJniEnvironment::findStaticMethod(jclass clazz, const char *methodName, const char *signature)

Ищет статический метод класса clazz. Метод задаётся его именем methodName и подписью signature.

Возвращает идентификатор метода или nullptr, если метод не найден.

Пример использования этого метода — поиск методов класса и кэширование их идентификаторов, чтобы они могли использоваться для вызова методов позже.

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.

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

Возвращает true, если этот экземпляр содержит действительный объект JNIEnv.

Эта функция была представлена в Qt 6.2.

[static] JavaVM *QJniEnvironment::javaVM()

Возвращает интерфейс Java VM для текущего процесса. Хотя в рамках одного процесса могут быть несколько Java VM, Android позволяет использовать только одну.

JNIEnv *QJniEnvironment::jniEnv() const

Возвращает указатель на JNIEnv среды JNI.

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

Регистрирует методы Java в массиве methods размера size, каждый из которых может вызывать нативные C++ функции из класса className. Эти методы должны быть зарегистрированы перед любой попыткой их вызова.

Возвращает true, если регистрация выполнена успешно, в противном случае false.

Каждый элемент в массиве методов состоит из:

  • Имени метода 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);

JNIEnv &QJniEnvironment::operator*() const

Возвращает объект JNIEnv среды JNI.

JNIEnv *QJniEnvironment::operator->() const

Обеспечивает доступ к указателю на JNIEnv среды JNI.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qjnienvironment.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API