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_consumerCMake 設定中に、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.cppvibrate 関数を使用してバイブレーションをトリガーできます。この関数は、VibrationEffectProxyVibratorManagerProxyVibratorProxy クラスを使用してバイブレーションを実行します。

通知

通知の送信はbackend.cppnotify 関数で処理され、NotificationManagerProxy クラスが使用されます。

通知はcreateNotification 関数のBackend クラス初期化中にすでに作成されています。

明るさの調整

明るさの調整は、IntentProxySettingsProxySystemProxyContextProxyLayoutParamsProxyWindowProxy クラスを使用して、backend.cppadjustBrightness 関数で処理されます。

音量の調整

音量の調整は、GlobalProxy およびAudioManagerProxy クラスを使用して、backend.cppadjustVolume 関数で処理されます。

プロジェクト例 @ code.qt.io

© 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.