QtJenny: Android API にアクセスするための C++ プロキシ・クラスの生成
QtJenny の使い方を紹介するデモ。
概要
このデモではQtJenny の使い方を紹介し、C++ コードから Android API にアクセスするための C++ プロキシ・クラスを生成します。生成された C++ クラスは、音量や明るさの調整、ウェイクロックの有効化と無効化、通知の送信、バイブレーションのトリガーなどのアクションを実行するためにデモで使用されます。これらのアクションは、Qtが実装していないAndroid APIの一部です。
QtJenny を使用して C++ クラスを生成することで、JNIコードを手動で記述する必要がなくなります。
どのように動作するか
このデモには、qtjenny_consumer
という Qt プロジェクトと、qtjenny_generator
という Android Studio プロジェクトの 2 つのパートがあります。qtjenny_consumer
には、アプリケーションの UI と、生成された C++ ヘッダーを使用したコードが含まれています。qtjenny_generator
には、QtJenny のクラスアノテーションとGradle
の設定が含まれています。
デモを起動するには、qtjenny_consumer
プロジェクトを実行する必要があります。qtjenny_consumer
のCMake
設定中に、qtjenny_generator
プロジェクトディレクトリのgradlew
タスクの実行を呼び出すことで、コード生成が自動的にトリガされます。
if (ANDROID) if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") set (gradlew_cmd "gradlew.bat") else() set (gradlew_cmd "./gradlew") endif() set (gradlew_arg "--rerun-tasks") set (gradlew_task "kaptReleaseKotlin") execute_process(COMMAND ${gradlew_cmd} ${gradlew_arg} ${gradlew_task} WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/qtjenny_generator") else() message(FATAL_ERROR "Example only works on Android") endif()
C++ヘッダーの生成
C++ヘッダーの生成は、qtjenny_generator
がビルドされると開始されます。これは、GenerateCppCode.kt
のアノテーションを処理するアノテーション・プロセッサをトリガーします。
@NativeClass @NativeProxy(allMethods = false, allFields = false) @NativeProxyForClasses(namespace = "android::os", classes = [BatteryManager::class, VibratorManager::class, Vibrator::class, VibrationEffect::class, Context::class, PowerManager::class, PowerManager.WakeLock::class]) @NativeProxyForClasses(namespace = "android::view", classes = [Window::class, WindowManager.LayoutParams::class]) @NativeProxyForClasses(namespace = "android::media", classes = [AudioManager::class]) @NativeProxyForClasses(namespace = "android::drawable", classes = [android.R.drawable::class]) @NativeProxyForClasses(namespace = "android::app", classes = [Activity::class, Notification::class, Notification.Builder::class, NotificationChannel::class, NotificationManager::class]) @NativeProxyForClasses(namespace = "android::provider", classes = [Settings.Global::class, Settings.System::class, Settings::class]) @NativeProxyForClasses(namespace = "android::content", classes = [Intent::class])
アノテーション・プロセッサは次に、qtjenny_output
ディレクトリにC++ ヘッダーを生成する。これらのC++ヘッダーには、このデモで使用するAndroid APIにアクセスするために必要なJNIボイラープレート・コードが含まれています。
qtjenny_generator
のアプリレベルbuild.gradle
スクリプトは、QtJenny が実装するkaptの引数を指定します。これらの引数は QtJenny コンパイラで解析され、生成プロセスで使用されます。
kapt { arguments { // pass arguments to jenny arg("jenny.outputDirectory", project.file("../../qtjenny_output")) arg("jenny.templateDirectory", project.file("../templates")) arg("jenny.headerOnlyProxy", "true") arg("jenny.useJniHelper", "false") arg("jenny.useTemplates", "true") } }
生成された C++ ヘッダをQt Quick アプリケーションで使用する
qtjenny_consumer
は、qtjenny_generator
で生成された C++ ヘッダを使用するQt Quick アプリケーションです。生成されたヘッダをbackend.h
ファイルにインクルードし、backend.cpp
でさまざまな Android API にアクセスするために使用します。
アプリのUIは1つのMain.qml
ファイルで構成されており、以下のコントロールとアクションが含まれています。
ウェイク・ロック
Switches を使って、完全または部分的なウェイクロックを有効化および無効化できます。チェックを入れると、backend.cpp
の関数が呼び出され、ウェイクロックが有効になり、ウェイクロックステータスのテキストが設定されます。
if (checked) { myBackEnd.setFullWakeLock() if (partialWakeLock.checked) partialWakeLock.click() mainWindow.wakeLockStatus = "Full WakeLock active"
部分的なウェイクロックの設定には、PowerManager.WakeLock
Android API に接続するWakeLockProxy
クラスを使用します。完全なウェイクロックの設定は、Window
Android APIに接続するWindowProxy
。
振動
backend.cpp
のvibrate
関数を使用してバイブレーションをトリガーできます。この関数は、VibrationEffectProxy
、VibratorManagerProxy
、VibratorProxy
クラスを使用してバイブレーションを実行します。
通知
通知の送信はbackend.cpp
のnotify
関数で処理され、NotificationManagerProxy
クラスが使用されます。
通知はcreateNotification
関数のBackend
クラス初期化中にすでに作成されています。
明るさの調整
明るさの調整は、IntentProxy
、SettingsProxy
、SystemProxy
、ContextProxy
、LayoutParamsProxy
、WindowProxy
クラスを使用して、backend.cpp
のadjustBrightness
関数で処理されます。
音量の調整
音量の調整は、GlobalProxy
およびAudioManagerProxy
クラスを使用して、backend.cpp
のadjustVolume
関数で処理されます。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.