diff options
| author | Tinja Paavoseppä <tinja.paavoseppa@qt.io> | 2023-09-05 13:26:42 +0300 |
|---|---|---|
| committer | Tinja Paavoseppä <tinja.paavoseppa@qt.io> | 2024-02-15 10:07:04 +0200 |
| commit | 1d1ba46f54bcec6449d285c8f1f71540cdb02015 (patch) | |
| tree | b7b32e06ca1d88fa9e3f259e069b57f4a851be88 /src/quick/platform/android/qandroidquickviewembedding.cpp | |
| parent | 560fe5a9fe57bcb245a6a7162450e826849061cb (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.cpp | 69 |
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 |
