C

Qt IF生成器扩展

Qt IF生成器扩展允许构建用于访问Android Automotive的中间件层,以访问车辆属性。它使用由Qt接口框架项目提供的工具和核心API。它还提供了额外的模板,这些模板可用于生成其他项目类型

项目类型描述
server_android_carapi_qtro为首次由前端选项生成的API生成基于QtRemoteObjects的后端服务器实现。此服务器提供完整和存根实现,要求使用QtRemoteObjects后端模板访问Android Automotive 车辆属性
backend_android_carapi_jni为首次由前端模板生成的API生成基于JNI的后端。此后端提供访问Android Automotive 车辆属性所需的完整和存根实现。

YAML注解

为了能够访问Android Automotive 车辆属性,除QFace IDL本身之外,还需要提供额外的配置。在Qt IF生成器扩展中,以下注解(在附带的YAML文件中)用于接口对象类型

  • 导入》标签
    config_android_automotive:
        imports: ["android.car.VehicleAreaSeat","android.car.VehicleAreaWindow"]

    定义与该接口处理属性相关的Android API导入列表(例如,区域ID常数)。条目将转换为导入列表

    import android.car.VehicleAreaSeat;
    import android.car.VehicleAreaWindow;
  • 区域别名》标签
    config_android_automotive:
        zoneAliases: ["DRIVER_ZONE_ID = VehicleAreaSeat.SEAT_ROW_1_LEFT | VehicleAreaSeat.SEAT_ROW_2_LEFT | VehicleAreaSeat.SEAT_ROW_2_CENTER",
                      "PASSENGER_ZONE_ID = VehicleAreaSeat.SEAT_ROW_1_RIGHT | VehicleAreaSeat.SEAT_ROW_2_RIGHT",
                      "SEAT_ALL = DRIVER_ZONE_ID | PASSENGER_ZONE_ID"]

    定义单个属性的区域别名,例如,与将多个子区域分组在一起的区域一起使用。条目将转换为Java常量

    public static final int DRIVER_ZONE_ID = VehicleAreaSeat.SEAT_ROW_1_LEFT | VehicleAreaSeat.SEAT_ROW_2_LEFT | VehicleAreaSeat.SEAT_ROW_2_CENTER;
    public static final int PASSENGER_ZONE_ID = VehicleAreaSeat.SEAT_ROW_1_RIGHT | VehicleAreaSeat.SEAT_ROW_2_RIGHT;
    public static final int SEAT_ALL = DRIVER_ZONE_ID | PASSENGER_ZONE_ID;
  • 区域映射》标签
    config_android_automotive:
        zoneMappings: {"" : "SEAT_ALL",
                       "Driver": "DRIVER_ZONE_ID",
                       "Passenger" : "PASSENGER_ZONE_ID"}

    定义从QtIF的QML字符串表示形式到Android Automotive底层Java枚举区域的区域映射。这将初始化如下的C++地图

    m_zoneMappings.insert(QStringLiteral(""), QAndroidJniObject::getStaticField<jint>(
                                                                        "io/qt/qtif/android/vehiclefunctions/QIfClimateControlSensors",
                                                                        "SEAT_ALL"));
    m_zoneMappings.insert(QStringLiteral("Driver"), QAndroidJniObject::getStaticField<jint>(
                                                                        "io/qt/qtif/android/vehiclefunctions/QIfClimateControlSensors",
                                                                        "DRIVER_ZONE_ID"));
    m_zoneMappings.insert(QStringLiteral("Passenger"), QAndroidJniObject::getStaticField<jint>(
                                                                        "io/qt/qtif/android/vehiclefunctions/QIfClimateControlSensors",
                                                                        "PASSENGER_ZONE_ID"));

在Qt IF生成器扩展中,以下注解(在附带的YAML文件中)用于属性对象类型

  • vhalId属性
    config_android_automotive:
        vhalId: "HVAC_AC_ON"

    定义为与Android Automotive车辆属性ID中定义的相关android属性ID。

  • 区域属性
    config_android_automotive:
        zone: ["DRIVER_ZONE_ID", "PASSENGER_ZONE_ID"]

    定义了相关android属性的区域枚举。该区域可以是接口的zoneAliases下定义的一个或多个值。如果一个区域包含多个值,这些值必须定义为数组。然后QML组件可以决定控制哪个区域。例如

    ClimateControl {
        id: climateControl
        zone: "Driver"
    }

    在QML中获取特定区域的climateControl的值,请使用以下代码片段

    property int tempValue = climateControl.zoneAt.Driver.targetTemperatureSet

生成后端插件的架构

在生成器输出目录中,首先创建一个新子文件夹,命名为相应的后端插件名称。所有生成的文件都放在这个文件夹中,形成一个插件库。代码生成的命名空间可以通过QFace或YAML文件进行控制。下表描述了Qt IF生成扩展提供的模板(后端类型)为生成的文件

Qt远程对象服务器

这个生成器模板应与包含Qt服务代码的项目一起使用。如果qmake/CMake发现Qt Remote Objects模块,则server_android_carapi_qtro模板才可用。生成的代码包含

  • 建立连接的代码
  • 使JNI接口能够调用的Java后端逻辑的代码
  • 访问Android Automotive所需完整的Java后端逻辑的默认实现 车辆属性
  • 如果默认实现不符合要求,可以实现Java接口来提供后端逻辑
文件名目的
core.h/cpp为源对象建立连接并启动远程通信的代码。
.pri包含所有生成文件的标准Qt .pri 文件。使用此 .pri 文件将生成文件包含到qmake项目中。它还包括 .rep 文件到项目中,并调用远程对象编译器(在实际编译之前执行的额外步骤)。
.cmake包含所有生成文件的标准Qt .cmake 文件。使用此 .cmake 文件将生成文件包含到CMake项目中。它还包括 .rep 文件到项目中,并调用远程对象编译器(在实际编译之前执行的额外步骤)。
.repQt replica编译器的输入文件,用于生成源类代码。
backend.h/cpp源QtRemoteObject实现(作为Java后端实现的适配器)。
native_mappings.cpp{{interface|lower}}backend.cpp和Java后端实现之间的JNI绑定。只有一个此类文件提供对所有库中定义的接口的映射。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}.java提供接口通知{{interface|lower}}backend.cpp属性值已更改。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/I{{interface}}.javaJava接口,QtService子类必须实现以提供自定义后端逻辑,如果默认实现不符合要求
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}Sensors.java提供默认Java后端实现在默认情况下使用的Android Automotive 车辆属性的包装器。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}Backend.java默认Java后端实现。

以下图表显示了可能的使用场景

  • 使用自定义实现来访问车辆属性
  • 使用默认实现来访问车辆属性

JNI后端

本生成器模板适用于插件项目。后端模板 backend_android_carapi_jni 提供可用于访问 Android Automotive 车辆属性的生产后端。生成的代码包含

  • 设置后端插件的代码
  • 启用 JNI 接口访问实际的 Java 后端逻辑的代码
  • 访问Android Automotive所需完整的Java后端逻辑的默认实现 车辆属性
  • 可以实现的 Java 接口,如果默认实现不符合要求,则提供后端逻辑
文件名目的
plugin.h/cpp定义实现 QtIf 后端插件的文件,该插件实现了 QIfServiceInterface
.json包含所需由 Qt 插件系统公开的特征接口标识符的文件。
.pri包含所有生成文件的标准的 Qt .pri 文件。使用此 .pri 文件将生成的文件包含到 qmake 项目中。
.cmake包含所有生成文件的标准 Qt .cmake 文件。使用此 .cmake 文件将生成的文件包含到 CMake 项目中。
backend.h/cppQIfZonedFeatureInterface/QIfFeatureInterface 实现(作为 Java 后端实现的适配器)。
native_mappings.cpp{{interface|lower}}backend.cpp和Java后端实现之间的JNI绑定。只有一个此类文件提供对所有库中定义的接口的映射。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}.java提供接口通知{{interface|lower}}backend.cpp属性值已更改。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/I{{interface}}.javaQtActivity 子类需要实现的 Java 接口,如果默认实现不符合要求,则提供自定义后端逻辑
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}Sensors.java提供默认Java后端实现在默认情况下使用的Android Automotive 车辆属性的包装器。
android/src/io/qt/{{module|qml_type|replace('.', '/')|lower}}/{{interface}}Backend.java默认Java后端实现。

以下图表显示了可能的使用场景

  • 使用默认实现来访问车辆属性
  • 使用自定义实现来访问车辆属性

在特定的 Qt 许可证下可用。
了解更多信息。