Qt 6.7 中的安卓 Java 綁定

https://www.qt.io/blog/changes-to-android-java-bindings-qt-6.7

Qt 6.7 中的 Android Java 綁定

自十多年前推出的 Qt for Android 插件便是一項開創性的變革,為希望利用 Qt 進行 Android 應用程式開發的開發人員開啟了多重可能性。雖然多年來已對 Android、Qt 和插件進行了許多更改以支援新功能,但整體架構和公共 Java 綁定並未有太大改變。這些綁定包含了對 Android Activity 的包裹器。是時候該進行調整了!在 Qt 6.7 中,我們致力於解決這些問題,並實現多項期望的成果,包括簡化架構和使插件的 Java 程式碼更模組化,從而幫助我們修復關鍵錯誤並增強對較新 Android 版本的支援。

公共 Java 綁定

Java 綁定是 Qt 對原生 Activity、Service、Application 類別等的包裹類別,負責在啟動 Android 應用程式時載入 Qt 共享庫。先前的實作的一個關鍵問題是不同類別未清楚區分責任。

載入原生庫

首先,讓我們來看看載入 Qt 庫的邏輯,該邏輯被分散在多個類別中,而且其中的邏輯重複。為了改善這點,我們進行了一些調整。然後,我們使 QtLoader 負責以下任務:

初始化 QJniObject 使用的類別載入器。

解析應用程式的元數據,例如應用程式使用的 Qt 庫清單或應用程式的庫名稱。

設定各種環境變數和主題,並組裝應用程式的引數清單。

處理與 Activity 或 Service 特定的初始化工作,分別由 QtActivityLoader 或 QtServiceLoader 負責。

載入 Qt 庫,然後再載入主庫。

活動和服務包裹器

在處理完載入器後,我們還剩下 QtActivity、QtService 和 QtApplication,它們分別擴展了 Android 的 Activity、Service 和 Application。我們將介紹 Qt 6.7 中的改變以及接下來的步驟。引入一個 QtActivityBase 包裹器,它在 Qt Android 包裹器上實作 Qt 的自定義功能,然後 QtActivity 可以簡單地擴展它,這樣就避免了昂貴的反射呼叫、巨大的程式碼重複,並使公共 QtActivity 非常輕量。這種重構避免了反射使用,極大簡化了 Qt for Android 應用程式的執行路徑。

責任的劃分

除外頭所述之外,Qt for Android 插件的 Java 程式碼各個角落都經歷了改變,將複雜的”通通做”類別改為具有明確模組化責任,處理顯示、剪貼簿、鍵盤管理等事項。這當然不是一次性工作,而是更多改進的開始,讓我們能輕鬆地將 Qt Android 端與 Android 的功能保持最新。

文檔

最後,我們還負責修訂了 Qt for Android 文檔頁面,使其保持最新、避免錯誤信息並降低重複度。我們還記錄了 Android 端架構及背後運作的方式。

您也可以在《新功能與變更》中查看 Qt for Android 的新功能和變更。

via Qt Blog

January 18, 2024 at 10:36PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *