我有一个自定义设置,需要通过 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 的文件夹结构。
我还写了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的文件夹结构
问题: 现在,我想从 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 层的指导或示例将不胜感激。
我也在尝试做同样的事情,但在将我的 .h 文件包含在 jni 代码中时遇到问题。