7#include <QtCore/QThread>
8#include <QtCore/QThreadStorage>
57 env->DeleteLocalRef(
obj);
74QJniEnvironment::QJniEnvironment()
78 const jint
ret = vm->GetEnv((
void**)&
d->jniEnv, JNI_VERSION_1_6);
82 if (
ret == JNI_EDETACHED) {
84 if (vm->AttachCurrentThread(&
d->jniEnv, &
args) != JNI_OK)
87 if (!jniEnvTLS->hasLocalData())
98QJniEnvironment::~QJniEnvironment()
100 checkAndClearExceptions();
108bool QJniEnvironment::isValid()
const
118JNIEnv *QJniEnvironment::operator->()
const
128JNIEnv &QJniEnvironment::operator*()
const
138JNIEnv *QJniEnvironment::jniEnv()
const
170jclass QJniEnvironment::findClass(
const char *
className)
186jmethodID QJniEnvironment::findMethod(jclass clazz,
const char *
methodName,
const char *signature)
189 jmethodID
id =
d->jniEnv->GetMethodID(clazz,
methodName, signature);
190 if (!checkAndClearExceptions(
d->jniEnv))
230jmethodID QJniEnvironment::findStaticMethod(jclass clazz,
const char *
methodName,
const char *signature)
233 jmethodID
id =
d->jniEnv->GetStaticMethodID(clazz,
methodName, signature);
234 if (!checkAndClearExceptions(
d->jniEnv))
272jfieldID QJniEnvironment::findField(jclass clazz,
const char *fieldName,
const char *signature)
275 jfieldID
id =
d->jniEnv->GetFieldID(clazz, fieldName, signature);
276 if (!checkAndClearExceptions())
304jfieldID QJniEnvironment::findStaticField(jclass clazz,
const char *fieldName,
const char *signature)
307 jfieldID
id =
d->jniEnv->GetStaticFieldID(clazz, fieldName, signature);
308 if (!checkAndClearExceptions())
332JavaVM *QJniEnvironment::javaVM()
359bool QJniEnvironment::registerNativeMethods(
const char *
className,
const JNINativeMethod
methods[],
367 return registerNativeMethods(clazz,
methods,
size);
369#if QT_DEPRECATED_SINCE(6, 2)
394bool QJniEnvironment::registerNativeMethods(
const char *
className, JNINativeMethod
methods[],
413bool QJniEnvironment::registerNativeMethods(jclass clazz,
const JNINativeMethod
methods[],
416 if (
d->jniEnv->RegisterNatives(clazz,
methods,
size) < 0) {
417 checkAndClearExceptions();
444bool QJniEnvironment::checkAndClearExceptions(QJniEnvironment::OutputMode outputMode)
446 return checkAndClearExceptions(
d->jniEnv, outputMode);
451 QString exceptionMessage(JNIEnv *env,
const jthrowable &exception)
456 auto logError = []() {
457 qWarning() <<
"QJniEnvironment: a null object returned or an exception occurred while "
458 "fetching a prior exception message";
461 auto checkAndClear = [env]() {
463 env->ExceptionClear();
469 const jclass logClazz = env->FindClass(
"android/util/Log");
470 if (checkAndClear() || !logClazz) {
475 const jmethodID methodId = env->GetStaticMethodID(logClazz,
"getStackTraceString",
476 "(Ljava/lang/Throwable;)Ljava/lang/String;");
477 if (checkAndClear() || !methodId) {
483 value.l =
static_cast<jobject
>(exception);
484 const jobject messageObj = env->CallStaticObjectMethodA(logClazz, methodId, &
value);
485 const jstring jmessage =
static_cast<jstring
>(messageObj);
489 char const *utfMessage = env->GetStringUTFChars(jmessage, 0);
492 env->ReleaseStringUTFChars(jmessage, utfMessage);
512bool QJniEnvironment::checkAndClearExceptions(JNIEnv *env, QJniEnvironment::OutputMode outputMode)
515 if (outputMode == OutputMode::Verbose) {
516 if (jthrowable exception = env->ExceptionOccurred()) {
517 env->ExceptionClear();
522 env->DeleteLocalRef(exception);
525 env->ExceptionDescribe();
526 env->ExceptionClear();
529 env->ExceptionClear();
static JNINativeMethod methods[]
~QJniEnvironmentPrivateTLS()
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Combined button and popup list for selecting options.
Q_CORE_EXPORT jclass findClass(const char *className, JNIEnv *env)
Q_CORE_EXPORT JavaVM * javaVM()
static QString methodName(const QDBusIntrospection::Method &method)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
static const char qJniThreadName[]
QScopedPointer< _jobject, QJniLocalRefDeleterPrivate > QJniScopedLocalRefPrivate
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint GLsizei const GLchar * message
const char className[16]
[1]
static void cleanup(jobject obj)