如何在JNI代码(Android.bp)中引用自定义AIDL HAL服务?

问题描述 投票:0回答:1

我有一个自定义设置,需要通过 Android JNI 服务中的 IPC 与自定义 HAL 进行交互。我正在处理的流程是:

HMI -> CustomSensorManager -> AIDL -> 自定义系统服务 -> Binder IPC -> 自定义 JNI 服务 -> AIDL -> 自定义 HAL 服务(供应商/框架)。

我成功创建了自定义 HAL,它读取传感器数据。这是 HAL 服务的 Android.bp:

cc_binary {
    name: "android.hardware.sensors-service",
    vendor: true,
    relative_install_path: "hw",
    init_rc: ["android.hardware.sensors-service.rc"],
    vintf_fragments: ["android.hardware.sensors-service.xml"],

    srcs: [
        "Sensors.cpp",
        "service.cpp",
        "ConvertUtils.cpp",
    ],
    
    shared_libs: [
        "libbase",
        "liblog",
        "libhardware",
        "libbinder_ndk",
        "libbinder",
        "libutils",
        "android.hardware.vsensors-V1-ndk",
    ], 
}

下面是自定义 HAL 的文件夹结构。

enter image description here

我还写了HAL的AIDL接口,如下:

aidl_interface {
    name: "android.hardware.vsensors",                            
    vendor: true,                                               
    srcs: ["android/hardware/vsensors/*.aidl"],                    
    stability: "vintf",                                          
    owner: "ABCD",                                             
    backend: {                                                   
        cpp: {                                                   
            enabled: false,                                      
        },                                                       
        java: {                                                  
            sdk_version: "module_current",                       
        },                                                       
    },                                                           
}

下面是aidl_interface的文件夹结构

enter image description here

问题: 现在,我想从 JNI 层与此 HAL 服务交互。我将 JNI 服务代码添加到:

frameworks/base/services/core/jni/Android.bp
frameworks/base/services/core/jni/com_android_server_CustomSensorService.cpp
frameworks/base/services/core/jni/onload.cpp

下面是我尝试通过IPC使用AIDL获取HAL服务的代码,但无法正确引用ISensors AIDL接口。

JNI代码(com_android_server_CustomSensorService.cpp):

static sp<ISensors> getSensorService() {
    if (gSensorService == nullptr) {
        sp<IServiceManager> sm = defaultServiceManager();
        sp<IBinder> binder = sm->getService(String16("android.hardware.vsensors.ISensor/default"));
        if (binder != nullptr) {
            gSensorService = android::interface_cast<ISensors>(binder);
            LOGI("Successfully connected to ISensors service");
        } else {
            LOGE("Failed to connect to ISensors service");
        }
    }
    return gSensorService;
}

问题:

我不确定如何在frameworks/base/services/core/jni/Android.bp 文件中正确引用或集成HAL 的aidl_interface。引用或添加AIDL接口以便JNI层能够找到它的正确方法是什么?

任何有关如何将 HAL 的 AIDL 正确链接到 JNI 层的指导或示例将不胜感激。

android android-ndk java-native-interface android-source aidl
1个回答
0
投票

我也在尝试做同样的事情,但在将我的 .h 文件包含在 jni 代码中时遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.