diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2023-10-28 17:09:59 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2023-11-13 18:26:24 +0100 |
commit | 570f08d517cab4dbd6aae55a0ffb22d518b0b2fc (patch) | |
tree | 542ecfc7770d2bce405cd2d8f163b5ccf871053b | |
parent | e2b33c1d1ce24435aaaf853e6261064f4763bde5 (diff) |
Android: modernize implementation
Declare used types, use modern variadic template APIs, and native
method declarations to get rid of all hand-crafted signature
strings.
In the native methods, cast the id (that was previously created
via reinterpret_cast from 'this', pointing to the private) back to
the private pointer directly, and only maintain a set of privates
to make sure that the id we get is still representing an alive
private.
Remove some dead (commented) code, and simplify JNI_OnLoad.
Change-Id: Ie8711e5f072edde5781b33941aee4e37b8213ea2
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
-rw-r--r-- | src/plugins/android/qandroidwebview.cpp | 270 | ||||
-rw-r--r-- | src/plugins/android/qandroidwebview_p.h | 14 |
2 files changed, 124 insertions, 160 deletions
diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp index f13e7e7..d7e6083 100644 --- a/src/plugins/android/qandroidwebview.cpp +++ b/src/plugins/android/qandroidwebview.cpp @@ -7,24 +7,29 @@ #include <QtCore/private/qjnihelpers_p.h> #include <QtCore/qjniobject.h> -#include <QtCore/qmap.h> -#include <android/bitmap.h> -#include <QtGui/qguiapplication.h> +#include <QtCore/qset.h> #include <QtCore/qjsondocument.h> #include <QtCore/qjsonobject.h> #include <QtCore/qurl.h> #include <QtCore/qdebug.h> +#include <QtCore/qthread.h> +#include <QtCore/qabstracteventdispatcher.h> -#include <QAbstractEventDispatcher> -#include <QThread> +#include <QtGui/qguiapplication.h> + +#include <android/bitmap.h> +#include <android/log.h> QT_BEGIN_NAMESPACE -QAndroidWebViewSettingsPrivate::QAndroidWebViewSettingsPrivate(QJniObject viewController, QObject *p) - : QAbstractWebViewSettings(p) - , m_viewController(viewController) -{ +Q_DECLARE_JNI_CLASS(Bitmap, "android/graphics/Bitmap"); + +using namespace QtJniTypes; +using namespace Qt::StringLiterals; +QAndroidWebViewSettingsPrivate::QAndroidWebViewSettingsPrivate(const WebViewController &viewController, QObject *p) + : QAbstractWebViewSettings(p), m_viewController(viewController) +{ } bool QAndroidWebViewSettingsPrivate::localStorageEnabled() const @@ -49,51 +54,30 @@ bool QAndroidWebViewSettingsPrivate::allowFileAccess() const void QAndroidWebViewSettingsPrivate::setLocalContentCanAccessFileUrls(bool enabled) { - m_viewController.callMethod<void>("setAllowFileAccessFromFileURLs", "(Z)V", enabled); + m_viewController.callMethod<void>("setAllowFileAccessFromFileURLs", enabled); } void QAndroidWebViewSettingsPrivate::setJavascriptEnabled(bool enabled) { - m_viewController.callMethod<void>("setJavaScriptEnabled", "(Z)V", enabled); + m_viewController.callMethod<void>("setJavaScriptEnabled", enabled); } void QAndroidWebViewSettingsPrivate::setLocalStorageEnabled(bool enabled) { - m_viewController.callMethod<void>("setLocalStorageEnabled", "(Z)V", enabled); + m_viewController.callMethod<void>("setLocalStorageEnabled", enabled); } void QAndroidWebViewSettingsPrivate::setAllowFileAccess(bool enabled) { - m_viewController.callMethod<void>("setAllowFileAccess", "(Z)V", enabled); + m_viewController.callMethod<void>("setAllowFileAccess", enabled); } -static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt/android/view/QtAndroidWebViewController"; - -//static bool favIcon(JNIEnv *env, jobject icon, QImage *image) -//{ -// // TODO: -// AndroidBitmapInfo bitmapInfo; -// if (AndroidBitmap_getInfo(env, icon, &bitmapInfo) != ANDROID_BITMAP_RESULT_SUCCESS) -// return false; - -// void *pixelData; -// if (AndroidBitmap_lockPixels(env, icon, &pixelData) != ANDROID_BITMAP_RESULT_SUCCESS) -// return false; - -// *image = QImage::fromData(static_cast<const uchar *>(pixelData), bitmapInfo.width * bitmapInfo.height); -// AndroidBitmap_unlockPixels(env, icon); - -// return true; -//} - -typedef QMap<quint64, QAndroidWebViewPrivate *> WebViews; +typedef QSet<QAndroidWebViewPrivate *> WebViews; Q_GLOBAL_STATIC(WebViews, g_webViews) QAndroidWebViewPrivate::QAndroidWebViewPrivate(QObject *p) - : QAbstractWebView(p) - , m_id(reinterpret_cast<quint64>(this)) - , m_callbackId(0) - , m_window(0) + : QAbstractWebView(p) , m_callbackId(0) , m_window(nullptr) + , m_viewController(nullptr) , m_webView(nullptr) { // QtAndroidWebViewController constructor blocks a qGuiThread until // the WebView is created and configured in UI thread. @@ -104,26 +88,22 @@ QAndroidWebViewPrivate::QAndroidWebViewPrivate(QObject *p) eventDispatcher->processEvents( QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers); } - m_viewController = QJniObject(qtAndroidWebViewControllerClass, - "(Landroid/app/Activity;J)V", - QtAndroidPrivate::activity().object(), - m_id); + m_viewController = WebViewController(QtAndroidPrivate::activity(), reinterpret_cast<jlong>(this)); QtAndroidPrivate::releaseAndroidDeadlockProtector(); - m_webView = m_viewController.callObjectMethod("getWebView", - "()Landroid/webkit/WebView;"); + m_webView = m_viewController.callMethod<WebView>("getWebView"); m_settings = new QAndroidWebViewSettingsPrivate(m_viewController, this); m_window = QWindow::fromWinId(reinterpret_cast<WId>(m_webView.object())); - g_webViews->insert(m_id, this); + g_webViews->insert(this); connect(qApp, &QGuiApplication::applicationStateChanged, this, &QAndroidWebViewPrivate::onApplicationStateChanged); } QAndroidWebViewPrivate::~QAndroidWebViewPrivate() { - g_webViews->take(m_id); + g_webViews->remove(this); if (m_window != 0) { m_window->setVisible(false); m_window->setParent(0); @@ -135,52 +115,40 @@ QAndroidWebViewPrivate::~QAndroidWebViewPrivate() QString QAndroidWebViewPrivate::httpUserAgent() const { - return QString( m_viewController.callObjectMethod<jstring>("getUserAgent").toString()); + return m_viewController.callMethod<QString>("getUserAgent"); } void QAndroidWebViewPrivate::setHttpUserAgent(const QString &userAgent) { - m_viewController.callMethod<void>("setUserAgent", - "(Ljava/lang/String;)V", - QJniObject::fromString(userAgent).object()); + m_viewController.callMethod<void>("setUserAgent", userAgent); Q_EMIT httpUserAgentChanged(userAgent); } QUrl QAndroidWebViewPrivate::url() const { - return QUrl::fromUserInput(m_viewController.callObjectMethod<jstring>("getUrl").toString()); + return QUrl::fromUserInput(m_viewController.callMethod<QString>("getUrl")); } void QAndroidWebViewPrivate::setUrl(const QUrl &url) { - m_viewController.callMethod<void>("loadUrl", - "(Ljava/lang/String;)V", - QJniObject::fromString(url.toString()).object()); + m_viewController.callMethod<void>("loadUrl", url.toString()); } void QAndroidWebViewPrivate::loadHtml(const QString &html, const QUrl &baseUrl) { - const QJniObject &htmlString = QJniObject::fromString(html); - const QJniObject &mimeTypeString = QJniObject::fromString(QLatin1String("text/html;charset=UTF-8")); - - baseUrl.isEmpty() ? m_viewController.callMethod<void>("loadData", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", - htmlString.object(), - mimeTypeString.object(), - 0) + const QString mimeTypeString = u"text/html;charset=UTF-8"_s; + baseUrl.isEmpty() ? m_viewController.callMethod<void>("loadData", html, mimeTypeString, + jstring(nullptr)) : m_viewController.callMethod<void>("loadDataWithBaseURL", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", - QJniObject::fromString(baseUrl.toString()).object(), - htmlString.object(), - mimeTypeString.object(), - 0, - 0); + baseUrl.toString(), + html, mimeTypeString, + jstring(nullptr), jstring(nullptr)); } bool QAndroidWebViewPrivate::canGoBack() const { - return m_viewController.callMethod<jboolean>("canGoBack"); + return m_viewController.callMethod<bool>("canGoBack"); } void QAndroidWebViewPrivate::goBack() @@ -190,7 +158,7 @@ void QAndroidWebViewPrivate::goBack() bool QAndroidWebViewPrivate::canGoForward() const { - return m_viewController.callMethod<jboolean>("canGoForward"); + return m_viewController.callMethod<bool>("canGoForward"); } void QAndroidWebViewPrivate::goForward() @@ -205,7 +173,7 @@ void QAndroidWebViewPrivate::reload() QString QAndroidWebViewPrivate::title() const { - return m_viewController.callObjectMethod<jstring>("getTitle").toString(); + return m_viewController.callMethod<QString>("getTitle"); } void QAndroidWebViewPrivate::setGeometry(const QRect &geometry) @@ -233,10 +201,7 @@ void QAndroidWebViewPrivate::runJavaScriptPrivate(const QString &script, Q_EMIT javaScriptResult(callbackId, QVariant()); } - m_viewController.callMethod<void>("runJavaScript", - "(Ljava/lang/String;J)V", - static_cast<jstring>(QJniObject::fromString(script).object()), - callbackId); + m_viewController.callMethod<void>("runJavaScript", script, jlong(callbackId)); } QAbstractWebViewSettings *QAndroidWebViewPrivate::getSettings() const @@ -247,29 +212,23 @@ QAbstractWebViewSettings *QAndroidWebViewPrivate::getSettings() const void QAndroidWebViewPrivate::setCookie(const QString &domain, const QString &name, const QString &value) { QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() { - QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "setCookie", - "(JLjava/lang/String;Ljava/lang/String;)V", - reinterpret_cast<quint64>(this), - static_cast<jstring>(QJniObject::fromString(domain).object()), - static_cast<jstring>(QJniObject::fromString(name + "=" + value).object())); + const QString cookie = name + u'=' + value; + WebViewController::callStaticMethod<void>("setCookie", jlong(this), domain, cookie); }); } void QAndroidWebViewPrivate::deleteCookie(const QString &domain, const QString &name) { QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() { - QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "removeCookie", - "(JLjava/lang/String;Ljava/lang/String;)V", - reinterpret_cast<quint64>(this), - static_cast<jstring>(QJniObject::fromString(domain).object()), - static_cast<jstring>(QJniObject::fromString(name.split(u'=').at(0) + u'=').object())); + const QString cookie = name.split(u'=').at(0) + u'='; + WebViewController::callStaticMethod<void>("removeCookie", jlong(this), domain, cookie); }); } void QAndroidWebViewPrivate::deleteAllCookies() { QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() { - QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "removeCookies"); + WebViewController::callStaticMethod<void>("removeCookies"); }); } @@ -280,12 +239,12 @@ void QAndroidWebViewPrivate::setVisible(bool visible) int QAndroidWebViewPrivate::loadProgress() const { - return m_viewController.callMethod<jint>("getProgress"); + return m_viewController.callMethod<int>("getProgress"); } bool QAndroidWebViewPrivate::isLoading() const { - return m_viewController.callMethod<jboolean>("isLoading"); + return m_viewController.callMethod<bool>("isLoading"); } void QAndroidWebViewPrivate::setParentView(QObject *view) @@ -330,9 +289,9 @@ static void c_onRunJavaScriptResult(JNIEnv *env, Q_UNUSED(env); Q_UNUSED(thiz); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = static_cast<QAndroidWebViewPrivate *>(wv[id]); - if (!wc) + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; const QString &resultString = QJniObject(result).toString(); @@ -351,6 +310,7 @@ static void c_onRunJavaScriptResult(JNIEnv *env, jsonValue.isNull() ? resultString : jsonValue.toVariant()); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onRunJavaScriptResult) static void c_onPageFinished(JNIEnv *env, jobject thiz, @@ -359,9 +319,10 @@ static void c_onPageFinished(JNIEnv *env, { Q_UNUSED(env); Q_UNUSED(thiz); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; QWebViewLoadRequestPrivate loadRequest(QUrl(QJniObject(url).toString()), @@ -369,20 +330,23 @@ static void c_onPageFinished(JNIEnv *env, QString()); Q_EMIT wc->loadingChanged(loadRequest); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onPageFinished) static void c_onPageStarted(JNIEnv *env, jobject thiz, jlong id, jstring url, - jobject icon) + Bitmap icon) { Q_UNUSED(env); Q_UNUSED(thiz); Q_UNUSED(icon); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; + QWebViewLoadRequestPrivate loadRequest(QUrl(QJniObject(url).toString()), QWebView::LoadStartedStatus, QString()); @@ -395,6 +359,7 @@ static void c_onPageStarted(JNIEnv *env, // if (favIcon(env, icon, &image)) // Q_EMIT wc->iconChanged(image); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onPageStarted) static void c_onProgressChanged(JNIEnv *env, jobject thiz, @@ -403,36 +368,38 @@ static void c_onProgressChanged(JNIEnv *env, { Q_UNUSED(env); Q_UNUSED(thiz); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; Q_EMIT wc->loadProgressChanged(newProgress); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onProgressChanged) static void c_onReceivedIcon(JNIEnv *env, jobject thiz, jlong id, - jobject icon) + Bitmap icon) { Q_UNUSED(env); Q_UNUSED(thiz); - Q_UNUSED(id); Q_UNUSED(icon); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; - if (!icon) + if (!icon.isValid()) return; // QImage image; // if (favIcon(env, icon, &image)) // Q_EMIT wc->iconChanged(image); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onReceivedIcon) static void c_onReceivedTitle(JNIEnv *env, jobject thiz, @@ -441,14 +408,16 @@ static void c_onReceivedTitle(JNIEnv *env, { Q_UNUSED(env); Q_UNUSED(thiz); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; const QString &qTitle = QJniObject(title).toString(); Q_EMIT wc->titleChanged(qTitle); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onReceivedTitle) static void c_onReceivedError(JNIEnv *env, jobject thiz, @@ -461,15 +430,17 @@ static void c_onReceivedError(JNIEnv *env, Q_UNUSED(thiz); Q_UNUSED(errorCode); - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) return; + QWebViewLoadRequestPrivate loadRequest(QUrl(QJniObject(url).toString()), QWebView::LoadFailedStatus, QJniObject(description).toString()); Q_EMIT wc->loadingChanged(loadRequest); } +Q_DECLARE_JNI_NATIVE_METHOD(c_onReceivedError) static void c_onCookieAdded(JNIEnv *env, jclass thiz, @@ -481,14 +452,15 @@ static void c_onCookieAdded(JNIEnv *env, Q_UNUSED(env); Q_UNUSED(thiz); - if (result) { - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) - return; + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) + return; + + if (result) Q_EMIT wc->cookieAdded(QJniObject(domain).toString(), QJniObject(name).toString()); - } } +Q_DECLARE_JNI_NATIVE_METHOD(c_onCookieAdded) static void c_onCookieRemoved(JNIEnv *env, jclass thiz, @@ -500,54 +472,42 @@ static void c_onCookieRemoved(JNIEnv *env, Q_UNUSED(env); Q_UNUSED(thiz); - if (result) { - const WebViews &wv = (*g_webViews); - QAndroidWebViewPrivate *wc = wv[id]; - if (!wc) - return; + Q_ASSERT(id); + QAndroidWebViewPrivate *wc = reinterpret_cast<QAndroidWebViewPrivate *>(id); + if (!g_webViews->contains(wc)) + return; + + if (result) Q_EMIT wc->cookieRemoved(QJniObject(domain).toString(), QJniObject(name).toString()); - } } +Q_DECLARE_JNI_NATIVE_METHOD(c_onCookieRemoved) -JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) +JNIEXPORT jint JNI_OnLoad(JavaVM* /* vm */, void* /*reserved*/) { static bool initialized = false; if (initialized) return JNI_VERSION_1_6; initialized = true; - typedef union { - JNIEnv *nativeEnvironment; - void *venv; - } UnionJNIEnvToVoid; - - UnionJNIEnvToVoid uenv; - uenv.venv = NULL; - - if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_6) != JNI_OK) + QJniEnvironment env; + if (!env.isValid()) { + qCritical("QtWebView: Failed to initialize the JNI Environment"); return JNI_ERR; - - JNIEnv *env = uenv.nativeEnvironment; - jclass clazz = QtAndroidPrivate::findClass(qtAndroidWebViewControllerClass, env); - if (!clazz) - return JNI_ERR; - - JNINativeMethod methods[] = { - {"c_onPageFinished", "(JLjava/lang/String;)V", reinterpret_cast<void *>(c_onPageFinished)}, - {"c_onPageStarted", "(JLjava/lang/String;Landroid/graphics/Bitmap;)V", reinterpret_cast<void *>(c_onPageStarted)}, - {"c_onProgressChanged", "(JI)V", reinterpret_cast<void *>(c_onProgressChanged)}, - {"c_onReceivedIcon", "(JLandroid/graphics/Bitmap;)V", reinterpret_cast<void *>(c_onReceivedIcon)}, - {"c_onReceivedTitle", "(JLjava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedTitle)}, - {"c_onRunJavaScriptResult", "(JJLjava/lang/String;)V", reinterpret_cast<void *>(c_onRunJavaScriptResult)}, - {"c_onReceivedError", "(JILjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedError)}, - {"c_onCookieAdded", "(JZLjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onCookieAdded)}, - {"c_onCookieRemoved", "(JZLjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onCookieRemoved)} - }; - - const int nMethods = sizeof(methods) / sizeof(methods[0]); - - if (env->RegisterNatives(clazz, methods, nMethods) != JNI_OK) + } + if (!env.registerNativeMethods(QtJniTypes::Traits<WebViewController>::className(), { + Q_JNI_NATIVE_METHOD(c_onRunJavaScriptResult), + Q_JNI_NATIVE_METHOD(c_onPageFinished), + Q_JNI_NATIVE_METHOD(c_onPageStarted), + Q_JNI_NATIVE_METHOD(c_onProgressChanged), + Q_JNI_NATIVE_METHOD(c_onReceivedIcon), + Q_JNI_NATIVE_METHOD(c_onReceivedTitle), + Q_JNI_NATIVE_METHOD(c_onReceivedError), + Q_JNI_NATIVE_METHOD(c_onCookieAdded), + Q_JNI_NATIVE_METHOD(c_onCookieRemoved), + })) { + qCritical("Failed to register native methods for WebViewController"); return JNI_ERR; + } return JNI_VERSION_1_6; } diff --git a/src/plugins/android/qandroidwebview_p.h b/src/plugins/android/qandroidwebview_p.h index c07832a..2876d03 100644 --- a/src/plugins/android/qandroidwebview_p.h +++ b/src/plugins/android/qandroidwebview_p.h @@ -19,16 +19,21 @@ #include <QtCore/qurl.h> #include <QtGui/qwindow.h> #include <QtCore/qjniobject.h> +#include <QtCore/qjnitypes.h> #include <private/qabstractwebview_p.h> +Q_DECLARE_JNI_CLASS(WebViewController, "org/qtproject/qt/android/view/QtAndroidWebViewController"); +Q_DECLARE_JNI_CLASS(WebView, "android/webkit/WebView"); + QT_BEGIN_NAMESPACE class QAndroidWebViewSettingsPrivate : public QAbstractWebViewSettings { Q_OBJECT public: - explicit QAndroidWebViewSettingsPrivate(QJniObject viewController, QObject *p = nullptr); + explicit QAndroidWebViewSettingsPrivate(const QtJniTypes::WebViewController &viewController, + QObject *p = nullptr); bool localStorageEnabled() const; bool javascriptEnabled() const; @@ -42,7 +47,7 @@ public Q_SLOTS: void setAllowFileAccess(bool enabled); private: - QJniObject m_viewController; + QtJniTypes::WebViewController m_viewController; }; class QAndroidWebViewPrivate : public QAbstractWebView @@ -87,11 +92,10 @@ private Q_SLOTS: void onApplicationStateChanged(Qt::ApplicationState state); private: - quint64 m_id; quint64 m_callbackId; QWindow *m_window; - QJniObject m_viewController; - QJniObject m_webView; + QtJniTypes::WebViewController m_viewController; + QtJniTypes::WebView m_webView; QAndroidWebViewSettingsPrivate *m_settings; }; |