aboutsummaryrefslogtreecommitdiffstats
path: root/src/androidextras/jni
diff options
context:
space:
mode:
Diffstat (limited to 'src/androidextras/jni')
-rw-r--r--src/androidextras/jni/qandroidjnienvironment.cpp58
-rw-r--r--src/androidextras/jni/qandroidjnienvironment.h17
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