qt5base-lts/tests/auto/corelib/kernel
Volker Hilsheimer 62cb5589b3 JNI: Make declared QtJniTypes classes proper QJniObjects
Instead of having a type that doesn't behave like a QJniObject, which
includes not holding a proper reference on the Java object, make the
QtJniTypes::Object type a QJniObject subclass that can be specialized
via CRTP to provide type-specific constructor and static functions.

QJniObject doesn't have a virtual destructor, but we subclass it only to
add a typed interface, without adding any additional data members.
Add versions of the static functions from QJniObjects to the
QtJniTypes::Object so that they can be called without explicitly
specifying the type or class name. This includes a constructor and named
constructors.

Constructing such objects means constructing a Java object of the class
the object type represents, as per the Q_DECLARE_JNI_CLASS declaration.
This is not without ambiguity, as constructing a type with a jobject
parameter can mean that a type wrapping an existing jobject should be
created, or that a Java object should be created with the provided
jobject as the parameter to the constructor (e.g. a copy constructor).
This ambiguity is for now inevitable; we need to be able to implicitly
convert jobject to such types. However, named constructors are provided
so that client code can avoid the ambiguity.

To prevent unnecessary default constructed QJniObjects that are then
replaced immediately with a properly constructed object, add a protected
QJniObject constructor that creates an uninitialized object (e.g. with
the d-pointer being nullptr), which we can then assign the constructed
jobject to using the available assignment operator. Add the special
copy and move constructor and assignment operators as explicit members
for clarity, even though the can all be defaulted.

Such QJniObject subclasses can then be transparently passed as arguments
into JNI call functions that expect a jobject representation, with the
QtJniTypes::Traits specialization from the type declaration providing the
correct signature.

QJniObject's API includes a lot of legacy overloads: with variadic
arguments, a explicit signature string, and jclass/jmethodID parameters
that are completely unused within Qt itself. In addition the explicit
"Object" member functions to explicitly call the version that returns a
jobject (and then a QJniObject). All this call-side complexity is taken
care of by the compile-time signature generation, implicit class type,
and template argument deduction. Overloads taking a jclass or jmethod
are not used anywhere in Qt, which is perhaps an indicator that they,
while nice to have, are too hard to use even for ourselves.

For the modern QtJniTypes class instantiations, remove all the overhead
and reduce the API to the small set of functions that are used all over
the place, and that don't require an explicit signature, or class/method
lookup.

This is a source incompatible change, as now QJniTypes::Object is no
longer a primitive type, and no longer binary equivalent to jobject.
However, this is acceptable as the API has so far been undocumented,
and is only used internally in Qt (and changes to adapt are largely
already merged).

Change-Id: I6d14c09c8165652095f30511f04dc17217245bf5
Reviewed-by: Juha Vuolle <juha.vuolle@qt.io>
2023-09-27 19:44:58 +02:00
..
qapplicationstatic CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qcoreapplication CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qdeadlinetimer CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qelapsedtimer CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qeventdispatcher tst_qeventdispatcher: port to QDeadlineTimer 2023-09-04 22:40:35 +03:00
qeventloop Remove the unix dispatcher from WASM builds 2023-08-22 17:19:50 +02:00
qjnienvironment CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qjniobject JNI: Make declared QtJniTypes classes proper QJniObjects 2023-09-27 19:44:58 +02:00
qjnitypes JNI: Make declared QtJniTypes classes proper QJniObjects 2023-09-27 19:44:58 +02:00
qmath CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetacontainer CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetaenum CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetamethod CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetaobject invokeMethod: Try invoking functor and member function accepting pointer, returning void 2023-08-24 07:45:04 +02:00
qmetaobjectbuilder CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetaproperty CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qmetatype QMetaType: fix recursive detection of std::optional operators 2023-07-31 18:43:55 -07:00
qmimedata tests/auto/*: port Q_FOREACH to ranged-for 2023-08-19 16:29:09 +03:00
qobject Allow QObjects to opt in to receiving ParentAboutToChange/ParentChange 2023-08-30 15:45:41 +02:00
qpermission Constrain QCoreApplication::requestPermission to compatible functors 2023-09-01 03:30:50 +02:00
qpointer QPointer: also provide a converting assignment operator 2023-09-23 22:10:10 +00:00
qproperty QProperty: Steal currentCompatProperty while evaluating a different one 2023-09-27 09:31:41 +00:00
qsignalblocker Implement QSignalBlocker::dismiss() 2023-08-31 22:11:51 +00:00
qsignalmapper CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qsocketnotifier QSocketNotifier: firm up the ordering in unexpectedDisconnection() 2023-07-11 13:44:29 -07:00
qtimer QTimer: extend property tests and fix binding loop 2023-09-03 18:20:51 +02:00
qtranslator Give QLocale::uiLanguages() a separator parameter 2023-08-16 16:25:48 +02:00
qvariant QVariant: add fromMetaType 2023-09-20 00:05:53 +02:00
qwineventnotifier CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
qwinregistrykey CMake: Make corelib tests standalone projects 2023-07-05 15:09:32 +02:00
CMakeLists.txt tests: Remove remains of qmake conversion from CMakeLists.txt files 2023-02-17 21:56:49 +01:00