Add objectClass() and className() for QJniObject

This can be handy sometimes to avoid doing a env->GetObjectClass() call
to get the jclass object.

Change-Id: I015fe5ed73304338826e468e59778bcd3ceadc3b
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
This commit is contained in:
Assam Boudjelthia 2021-05-07 12:05:34 +03:00
parent 3d430935cf
commit 8221b6b8c1
3 changed files with 37 additions and 9 deletions

View File

@ -286,12 +286,7 @@ bool QJniEnvironment::registerNativeMethods(const char *className, JNINativeMeth
if (!classObject.isValid()) if (!classObject.isValid())
return false; return false;
return registerNativeMethods(classObject.objectClass(), methods, size);
jclass clazz = d->jniEnv->GetObjectClass(classObject.object());
const bool result = registerNativeMethods(clazz, methods, size);
d->jniEnv->DeleteLocalRef(clazz);
return result;
} }
/*! /*!

View File

@ -779,10 +779,10 @@ QJniObject::~QJniObject()
jstring jstring = string.object<jstring>(); jstring jstring = string.object<jstring>();
\endcode \endcode
\note The returned object is still kept live by this QJniObject. To keep the \note The returned object is still kept alive by this QJniObject. To keep the
object live beyond the lifetime of this QJniObject, for example to record it object alive beyond the lifetime of this QJniObject, for example to record it
for later use, the easiest approach is to store it in another QJniObject with for later use, the easiest approach is to store it in another QJniObject with
a suitable lifetime. Alternatively, you can make a new global reference to the a suitable lifetime. Alternatively, you may create a new global reference to the
object and store it, taking care to free it when you are done with it. object and store it, taking care to free it when you are done with it.
\snippet jni/src_qjniobject.cpp QJniObject scope \snippet jni/src_qjniobject.cpp QJniObject scope
@ -792,6 +792,36 @@ jobject QJniObject::object() const
return javaObject(); return javaObject();
} }
/*!
\fn jclass QJniObject::objectClass() const
Returns the class object held by the QJniObject as a \c jclass.
\note The returned object is still kept alive by this QJniObject. To keep the
object alive beyond the lifetime of this QJniObject, for example to record it
for later use, the easiest approach is to store it in another QJniObject with
a suitable lifetime. Alternatively, you may create a new global reference to the
object and store it, taking care to free it when you are done with it.
\since 6.2
*/
jclass QJniObject::objectClass() const
{
return d->m_jclass;
}
/*!
\fn QByteArray QJniObject::className() const
Returns the name of the class object held by the QJniObject as a \c QByteArray.
\since 6.2
*/
QByteArray QJniObject::className() const
{
return d->m_className;
}
QJniObject QJniObject::callObjectMethodV(const char *methodName, QJniObject QJniObject::callObjectMethodV(const char *methodName,
const char *signature, const char *signature,
va_list args) const va_list args) const

View File

@ -68,6 +68,9 @@ public:
return static_cast<T>(javaObject()); return static_cast<T>(javaObject());
} }
jclass objectClass() const;
QByteArray className() const;
template <typename T> template <typename T>
T callMethod(const char *methodName, const char *signature, ...) const T callMethod(const char *methodName, const char *signature, ...) const
{ {