aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/platform/android/qandroidquickviewembedding.cpp
diff options
context:
space:
mode:
authorTinja Paavoseppä <tinja.paavoseppa@qt.io>2023-09-05 13:26:42 +0300
committerTinja Paavoseppä <tinja.paavoseppa@qt.io>2024-02-15 10:07:04 +0200
commit1d1ba46f54bcec6449d285c8f1f71540cdb02015 (patch)
treeb7b32e06ca1d88fa9e3f259e069b57f4a851be88 /src/quick/platform/android/qandroidquickviewembedding.cpp
parent560fe5a9fe57bcb245a6a7162450e826849061cb (diff)
Android: Add QtQuickView class to embed QQuickView to Android
Add Java class QtQuickView to enable embedding a QQuickView to an Android app form Java or Kotlin. Also add a JNI helper method to be able to create the QQuickView from Java/Kotlin. Pick-to: 6.7 Task-number: QTBUG-116953 Change-Id: I131eb84f3247fea3ec8d08612e6dd6567f5dca83 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/quick/platform/android/qandroidquickviewembedding.cpp')
-rw-r--r--src/quick/platform/android/qandroidquickviewembedding.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp
new file mode 100644
index 0000000000..2a1bd81b83
--- /dev/null
+++ b/src/quick/platform/android/qandroidquickviewembedding.cpp
@@ -0,0 +1,69 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include <QtQuick/private/qandroidquickviewembedding_p.h>
+
+#include <QtCore/qjnienvironment.h>
+#include <QtCore/qjniobject.h>
+#include <QtCore/qjnitypes.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_JNI_CLASS(QtDelegate, "org/qtproject/qt/android/QtEmbeddedContextDelegate");
+Q_DECLARE_JNI_CLASS(QtQuickView, "org/qtproject/qt/android/QtQuickView");
+Q_DECLARE_JNI_CLASS(QtWindow, "org/qtproject/qt/android/QtWindow");
+Q_DECLARE_JNI_CLASS(View, "android/view/View");
+
+namespace QtAndroidQuickViewEmbedding
+{
+ void createQuickView(JNIEnv*, jobject nativeWindow, jstring qmlUri, jint width, jint height,
+ jlong parentWindowReference)
+ {
+ static_assert (sizeof(jlong) >= sizeof(void*),
+ "Insufficient size of Java type to hold the c++ pointer");
+ const QUrl qmlUrl(QJniObject(qmlUri).toString());
+ QMetaObject::invokeMethod(qApp, [qtViewObject = QJniObject(nativeWindow),
+ parentWindowReference,
+ width,
+ height,
+ qmlUrl] {
+ QWindow *parentWindow = reinterpret_cast<QWindow *>(parentWindowReference);
+ QQuickView* view = new QQuickView(parentWindow);
+ view->setSource(qmlUrl);
+ view->setColor(QColor(Qt::transparent));
+ view->setWidth(width);
+ view->setHeight(height);
+ const QtJniTypes::QtWindow window = reinterpret_cast<jobject>(view->winId());
+ qtViewObject.callMethod<void>("addQtWindow",
+ window,
+ reinterpret_cast<jlong>(view),
+ parentWindowReference);
+ });
+ }
+
+ bool registerNatives(QJniEnvironment& env) {
+ return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(),
+ {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView,
+ QtAndroidQuickViewEmbedding)});
+ }
+}
+
+Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
+{
+ Q_UNUSED(vm)
+ Q_UNUSED(reserved)
+
+ static bool initialized = false;
+ if (initialized)
+ return JNI_VERSION_1_6;
+ initialized = true;
+
+ QJniEnvironment env;
+ if (!env.isValid())
+ return JNI_ERR;
+ if (!QtAndroidQuickViewEmbedding::registerNatives(env))
+ return JNI_ERR;
+ return JNI_VERSION_1_6;
+}
+
+QT_END_NAMESPACE