
EVS HAL和Camera HAL是Android系统中访问相机设备节点的两条路径,理论上是独立的两个HAL层。现在想做一个验证:EVS HAL初始化阶段通过Camera HAL Provider接口设备节点是否可行(理论上是可行的),查询操作的耗时怎样。
跨HAL访问Camera HAL Provider接口如下:
1.添加ICameraProvider的引用
cpp
//packages/services/Car/cpp/evs/sampleDriver/aidl/src/EvsEnumerator.h
//添加ICameraProvider.h引用
#include <aidl/android/hardware/camera/provider/ICameraProvider.h>
//packages/services/Car/cpp/evs/sampleDriver/aidl/src/EvsEnumerator.cpp
//添加ICameraProvider namespace声明和接口使用
using ::aidl::android::hardware::camera::provider::ICameraProvider;
void EvsEnumerator::enumerateCameras() {
if (!sConfigManager) {
return;
}
//如下是查询CameraProvider
LOG(INFO) << "#####START ";
{
std::vector<std::string> cameraList;
const std::string serviceDescriptor =
std::string(ICameraProvider::descriptor) + "/internal/0";
ndk::SpAIBinder cameraProviderBinder =
ndk::SpAIBinder(AServiceManager_waitForService(serviceDescriptor.c_str()));
if (cameraProviderBinder.get() == nullptr) {
LOG(ERROR) << "Get camera service failed.";
return;
}
std::shared_ptr<ICameraProvider> cameraProvider =
ICameraProvider::fromBinder(cameraProviderBinder);
if (cameraProvider.get() == nullptr) {
LOG(ERROR) << "Get camera service failed.";
return;
}
ScopedAStatus ret = cameraProvider->getCameraIdList(&cameraList);
if (ret.get() == nullptr) {
LOG(ERROR) << "Get camera list failed.";
} else {
LOG(INFO) << "The platform has " << cameraList.size() << " cameras";
}
}
LOG(INFO) << "#####STOP ";
...
}
2.添加对ICameraProvider的依赖关系
cpp
//packages/services/Car/cpp/evs/sampleDriver/aidl/Android.bp
cc_binary {
name: "android.hardware.automotive.evs-default",
defaults: ["android.hardware.graphics.common-ndk_static"],
...
static_libs: [
"android.frameworks.automotive.display-V2-ndk",
"android.hardware.automotive.evs-V2-ndk",
"android.hardware.common-V2-ndk",
"libaidlcommonsupport",
"libcutils",
"android.hardware.camera.provider-V3-ndk",
]
...
}