このブログ記事は、シリーズの3つ目で、6.7でテクノロジープレビューとして初めて登場する魅力的な機能を紹介します。以前のブログ記事では、AndroidにおけるQt QuickのViewと、Qt Tools for Android Studio プラグインについて説明しました。本開発手法はまだ新しいため、私たち自身が何と呼ぶべきかわかりません😊。コメントで名前の提案をお待ちしています!このブログ記事では、ワークフロー、ツール、必要なQtモジュール、および技術的な仕組みについて少し詳しく見ていきます。
ワークフローは状況に応じて異なりますが、通常はデザイン、ユーザーインターフェース(UI)の開発、そしてアプリケーション(アプリ)の開発の3つのステップがあります。1人でプロジェクトを進める場合はこれらが統合されることもありますが、大規模なプロジェクトではそれぞれの専門家が担当することが一般的です。最も大きな変化は、ワークフローのアプリケーション開発フェーズにあります。
既存のワークフローでは、Androidで作業するアプリケーション開発者は、Qtフレームワークモジュールや Qt Creator IDE などのツールを使用してアプリケーションを開発します。一部の開発者はAndroid Studio IDEをインストールしますが、これは任意です。その後、アプリケーションのコードベースのほとんどまたはすべてがQt C++またはQMLを使用して書かれます。必要に応じて、Qtのクロスプラットフォームモジュールで提供されていない部分がある場合、アプリケーション開発者はAndroid Java APIを使用できます。たとえば、QtのQjniObjectクラスを使用してJava Native Interface(JNI)を介してアクセスします。ビルド時には、QtはandroiddeployqtおよびGradleツールを使用してAndroidアプリケーションをビルドし、AndroidおよびQtライブラリをAPK(Androidパッケージ)にパッケージ化します。
実行時には、AndroidアプリケーションがQtを読み込みますが、その後、QtがAndroidアプリケーションとライフサイクル管理を制御し、Android UIスレッドとは別のスレッドを開始します。
この既存の方法の最大の利点は、アプリケーションがiOSで動作し、必要に応じて、努力を最小限に抑えてデスクトップや組み込みOSでも動作するということです。
新しいワークフローでは、アプリケーション開発者はAndroid Studio IDEを使用してアプリケーションを構築します。KotlinまたはJavaでコーディングし、Qt Quick 3DモジュールやQt Data Visualizationモジュールなど、Androidが提供していない部分だけにQtのQMLを使用することができます。C++のコーディングやQt Creator IDEは必要ありません。Android Studio IDEとQt Tools for Android Studioプラグインだけで十分です。
ユーザーインターフェース開発者はQt Creatorを使用するかもしれませんが、Qt Design Studioだけでも問題ありません。ビルド時には、AndroidはAndroid StudioとGradleを使用してAndroidアプリケーションをビルドしますが、Qt Tools for Android Studioがandroiddeployqtを使用して、QtライブラリをAPK内にパッケージ化するためにbuild.gradleファイルを変更します。実行時には、AndroidアプリケーションがQtのコンテンツを制御し、ライフサイクル管理を行いますが、Qtがスレッドの実行を処理します。
この新しいワークフローの最大の利点は、既存のJavaやKotlinで書かれたAndroidアプリケーションにQt QuickとQMLの美しさを簡単に追加できることです。
では、この新しい方法を使用して、JavaまたはKotlinで書かれたAndroidアプリケーションがC++で書かれたQt Quickモジュールとどのように接続されるのでしょうか? Qtライブラリは、Qt for Android Android QPAの内部を使用して、androiddeployqtおよびライブラリを列挙するXMLファイルを利用して、既存と同様の方法でロードされます。 外部の QWindow は、Android Activityコンテキストを表すためにQtQuickViewをラップし、QtQuickViewをQWindowの子ウィンドウとして追加し、QMLファイルを読み込みます。 Android の Java QtQuickView APIからQt C++ QQuickViewへの接続は、基本的にJNIを使用した双方向のラッパーです。このラッパーは、Java側に格納されたポインタを使用して動作し、JNI呼び出しが実行される際にC++から使用され、そのプロパティとシグナルを持つQObject ベースクラスに基づいています。
QMLには、QMLプロパティが接続ポイントとして存在します。 Java側は、ハンドラを使用してQMLシグナルを監視し、変数を接続ポイントとして持っています。プロパティの値は、同期的にQMLからJava側に取得することもできます。 Qt 6.7では、整数から文字列までの基本的なプロパティタイプがサポートされています。 JavaからQtタイプへ、およびその逆の型変換は、JNIとQJniObjectおよびQJniTypesを使用して行われます。
早期採用者の皆様を感謝します!Qt 6.8 Betaのリリースにご期待ください。最新の情報は、www.qt.io/blog/tag/releases をフォローしていただければと思います。これにより、JavaとQMLの間での強い型付けサポートや、より複雑なデータ交換をサポートする新機能がたくさん追加され、Qt for Androidの革新的なアプローチがさらに向上します!