diff options
Diffstat (limited to 'src/androidextras/jni')
-rw-r--r-- | src/androidextras/jni/qandroidjnienvironment.cpp | 58 | ||||
-rw-r--r-- | src/androidextras/jni/qandroidjnienvironment.h | 17 |
2 files changed, 75 insertions, 0 deletions
diff --git a/src/androidextras/jni/qandroidjnienvironment.cpp b/src/androidextras/jni/qandroidjnienvironment.cpp index 0800906..08f0c71 100644 --- a/src/androidextras/jni/qandroidjnienvironment.cpp +++ b/src/androidextras/jni/qandroidjnienvironment.cpp @@ -108,4 +108,62 @@ QAndroidJniEnvironment::operator JNIEnv*() const return d->jniEnv; } +static void clearException(bool silent) +{ + QAndroidJniEnvironment env; + if (Q_UNLIKELY(env->ExceptionCheck())) { + if (!silent) + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +/*! + \class QAndroidJniExceptionCleaner + \inmodule QtAndroidExtras + + The QAndroidJniExceptionCleaner is a convenience class useful to clean + the pending JNI exceptions from the current scope. + + \since 5.10 +*/ + +/*! + \enum QAndroidJniExceptionCleaner::OutputMode + + \value Silent the exceptions are cleaned silently + \value Verbose discribes the exceptions before cleaning them +*/ + +/*! + \fn QAndroidJniExceptionCleaner::QAndroidJniExceptionCleaner(OutputMode outputMode = OutputMode::Silent) + + Cleans any pending exceptions either silently or with descriptions, depending on the \a outputMode. + */ +QAndroidJniExceptionCleaner::QAndroidJniExceptionCleaner(QAndroidJniExceptionCleaner::OutputMode outputMode) + : m_outputMode(outputMode) +{ + clearException(outputMode == OutputMode::Silent); +} + +/*! + \fn QAndroidJniExceptionCleaner::~QAndroidJniExceptionCleaner() + + Clean any pending exceptions. + */ +QAndroidJniExceptionCleaner::~QAndroidJniExceptionCleaner() +{ + clearException(m_outputMode == OutputMode::Silent); +} + +/*! + \fn void QAndroidJniExceptionCleaner::clean() + + Manually cleans any pending exceptions + */ +void QAndroidJniExceptionCleaner::clean() +{ + clearException(m_outputMode == OutputMode::Silent); +} + QT_END_NAMESPACE diff --git a/src/androidextras/jni/qandroidjnienvironment.h b/src/androidextras/jni/qandroidjnienvironment.h index fcced40..654117b 100644 --- a/src/androidextras/jni/qandroidjnienvironment.h +++ b/src/androidextras/jni/qandroidjnienvironment.h @@ -63,6 +63,23 @@ private: QScopedPointer<QJNIEnvironmentPrivate> d; }; +class Q_ANDROIDEXTRAS_EXPORT QAndroidJniExceptionCleaner +{ +public: + enum class OutputMode { + Silent, + Verbose + }; + +public: + explicit QAndroidJniExceptionCleaner(OutputMode outputMode = OutputMode::Silent); + ~QAndroidJniExceptionCleaner(); + + void clean(); +private: + OutputMode m_outputMode; +}; + QT_END_NAMESPACE #endif // QANDROIDJNIENVIRONMENT_H |