aboutsummaryrefslogtreecommitdiffstats
path: root/src/androidextras/jni
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kdab.com>2017-07-04 14:13:29 +0300
committerBogDan Vatra <bogdan@kdab.com>2017-07-26 08:02:26 +0000
commit7c38ca387cf3e9aa6d7f47a00b296247da102147 (patch)
treeee4ab281c729f561c2e85c2b6d8a72de2fe581cc /src/androidextras/jni
parentda807f68d37fb3159196627904a1554405df90f6 (diff)
Say hello to low level Android Service & Binder implementations
These are the building blocks for higher level APIs such as Qt Remote Objects. [ChangeLog][Android] Added low level APIs for Android Service & Binder. Change-Id: I320214d310a398541bbde985ecf67bf6101c0b67 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
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