From b5dd6d98bf61f02277048b01bd0322453d877003 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 20 Sep 2023 23:20:34 +0200 Subject: [PATCH] JNI: move private QJniObject helpers out of the public header Functions that are not called by any of the inline code don't have to be in the public header. Move them as static functions into the translation unit. Remove some useless wrappers in the private, and move the code for private and static functions together. Some private helpers have to stay in the ABI as they used to be called by at least one public inline function up to Qt 6.6. Remove them from the API using QT_CORE_REMOVED_SINCE. Change-Id: I7eb7b2ba994dfda9de11e2d090a70842dad17247 Reviewed-by: Juha Vuolle --- src/corelib/compat/removed_api.cpp | 21 ++++++++++++ src/corelib/kernel/qjniobject.cpp | 52 +++++++++++++----------------- src/corelib/kernel/qjniobject.h | 11 ++++--- 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index a504bef17d..04af737add 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -618,6 +618,27 @@ QStringView QXmlStreamAttributes::value(QLatin1StringView qualifiedName) const #if QT_CORE_REMOVED_SINCE(6, 7) +#if defined(Q_OS_ANDROID) + +#include "qjniobject.h" + +jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env, bool /*binEncoded*/) +{ + return QJniObject::loadClass(className, env); +} + +QByteArray QJniObject::toBinaryEncClassName(const QByteArray &className) +{ + return QByteArray(className).replace('/', '.'); +} + +void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const +{ + env->CallVoidMethodV(javaObject(), id, args); +} + +#endif // Q_OS_ANDROID + #include "qlocale.h" QStringList QLocale::uiLanguages() const diff --git a/src/corelib/kernel/qjniobject.cpp b/src/corelib/kernel/qjniobject.cpp index f231f38e1d..40e0cb2eac 100644 --- a/src/corelib/kernel/qjniobject.cpp +++ b/src/corelib/kernel/qjniobject.cpp @@ -309,9 +309,27 @@ static jclass getCachedClass(const QByteArray &className) return it != cachedClasses->constEnd() ? it.value() : nullptr; } -QByteArray QJniObject::toBinaryEncClassName(const QByteArray &className) +/*! + \internal + + Get a JNI object from a jobject variant and do the necessary + exception clearing and delete the local reference before returning. + The JNI object can be null if there was an exception. +*/ +static QJniObject getCleanJniObject(jobject object) { - return QByteArray(className).replace('/', '.'); + if (!object) + return QJniObject(); + + QJniEnvironment env; + if (env.checkAndClearExceptions()) { + env->DeleteLocalRef(object); + return QJniObject(); + } + + QJniObject res(object); + env->DeleteLocalRef(object); + return res; } /*! @@ -370,7 +388,7 @@ jclass QtAndroidPrivate::findClass(const char *className, JNIEnv *env) return clazz; } -jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env, bool /*binEncoded*/) +jclass QJniObject::loadClass(const QByteArray &className, JNIEnv *env) { return QtAndroidPrivate::findClass(className, env); } @@ -398,13 +416,8 @@ void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, ...) const { va_list args; va_start(args, id); - callVoidMethodV(env, id, args); - va_end(args); -} - -void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const -{ env->CallVoidMethodV(d->m_jobject, id, args); + va_end(args); } jmethodID QJniObject::getCachedMethodID(JNIEnv *env, @@ -711,27 +724,6 @@ QJniObject::QJniObject(jobject object) This function is only available if all \a args are known \l {JNI Types}. */ -/*! - \brief Get a JNI object from a jobject variant and do the necessary - exception clearing and delete the local reference before returning. - The JNI object can be null if there was an exception. -*/ -QJniObject QJniObject::getCleanJniObject(jobject object) -{ - if (!object) - return QJniObject(); - - QJniEnvironment env; - if (env.checkAndClearExceptions()) { - env->DeleteLocalRef(object); - return QJniObject(); - } - - QJniObject res(object); - env->DeleteLocalRef(object); - return res; -} - /*! \fn QJniObject::~QJniObject() diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h index af7f1a9bba..4b34370923 100644 --- a/src/corelib/kernel/qjniobject.h +++ b/src/corelib/kernel/qjniobject.h @@ -528,9 +528,14 @@ public: } private: - static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded = false); + static jclass loadClass(const QByteArray &className, JNIEnv *env); + +#if QT_CORE_REMOVED_SINCE(6, 7) + // these need to stay in the ABI as they were used in inline methods before 6.7 + static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded); static QByteArray toBinaryEncClassName(const QByteArray &className); - static QJniObject getCleanJniObject(jobject obj); + void callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const; +#endif static jfieldID getCachedFieldID(JNIEnv *env, jclass clazz, const QByteArray &className, const char *name, const char *signature, @@ -549,8 +554,6 @@ private: const char *signature, bool isStatic = false); void callVoidMethodV(JNIEnv *env, jmethodID id, ...) const; - // ### Qt 7: merge into ... overload - void callVoidMethodV(JNIEnv *env, jmethodID id, va_list args) const; bool isSameObject(jobject obj) const; bool isSameObject(const QJniObject &other) const;