Android11 HAL层开发

本文解决Android11中HAL服务的编译和运行问题,包括直通式HAL的弃用及Binderized HAL的使用方法,并修复了sp构造函数的指针错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在搞Android11,拉起hal服务的时候报错了,一直崩。
这篇文章主要是解决编译和运行问题,如果对怎么编写HAL感兴趣的可以看看我之前写的Android8.1HAL层开发 ,详细写了从HAL服务的代码编写,到文件配置,再到APP如何调用。

首先,Android11不能使用直通式HAL的写法了,会报以下的错误:

LegacySupport: Could not get passthrough implementation for android.hardware.fingerprint@1.0::IFingerprint/default

改成Binderized HAL的写法就可以了。


另外还遇到一个指针报错,如下:

sp      : sp<> constructed with stack pointer argument

为什么会报这个错误呢??是因为Android11增加了一个针对sp的检查,具体看谷歌的一个patch:
Add check to sp<> raw pointer constructor

不能按照 Android8.1HAL层开发 这样写service.cpp文件了,要改成指针的写法,如下:

//service.cpp
#define LOG_TAG "android.hardware.fingerprint@1.0-service"

#include <android-base/logging.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/fingerprint/1.0/IFingerprint.h>
#include <hidl/LegacySupport.h>

#include "Fingerprint.h"

using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::hardware::fingerprint::V1_0::implementation::Fingerprint;

int main() {

    configureRpcThreadpool(4, true);

    //Fingerprint fingerprint;
    //auto status = fingerprint.registerAsService();
    // 不能像上面的注释这样写了,要按照如下写法,使用指针
    auto service = std::make_unique<Fingerprint>();
    auto status = service->registerAsService();
    
    CHECK_EQ(status, android::OK) << "Failed to register fingerprint HAL implementation";

    joinRpcThreadpool();
    return 0;  // joinRpcThreadpool shouldn't exit
}

以上。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值