Android 8.1 write HIDL

本文详细介绍了如何在 Android 8.1 中编写和配置 HIDL(硬件接口描述语言)。从编辑 Android.bp 文件开始,创建指定目录结构,编写 IMyService.hal 和 types.hal,使用 hidl-gen 工具自动生成源代码,到创建 Android.bp、service.cpp 文件,以及设置服务资源文件,最后编译模块,整个过程清晰地展示了实现 HIDL 的关键步骤。

Below <company> <module> <mylib> replace with your own names.

(1) edit <TOP>/Android.bp, add custom path:

...........
optional_subdirs = [
    ...................
    "vendor/<company>/<module>/*/*",
]

(2) create dir :  vendor/<company>/<module>/

mkdir vendor/<company>/<module>/interfaces/<mylib>/1.0/default

(3) create IMyService.hal and types.hal under dir vendor/<company>/<module>/interfaces/<mylib>/1.0

 

//IMyService.hal
package vendor.<company>.<mylib>@1.0;
 
interface IMyService{
    getVal1() generates (MyResult result);   
    doJob(vec<uint8_t> arr1, int32_t i2, string s3) generates (MyResult result);
};
// type.hal
package vendor.<company>.<mylib>@1.0;

struct MyResult {
    int32_t i1;
    string s2;
    vec<uint8_t> arr3;
};

(4) call hidl-gen to generate files:

hidl-gen -o vendor/company/module/interfaces/mylib/1.0/default -Lc++-impl -rvendor.company:vendor/company/module/interfaces/ -randroid.hidl:system/libhidl/transport vendor.company.mylib@1.0 
hidl-gen -o vendor/company/module/interfaces/mylib/1.0/default -Landroidbp-impl -rvendor.company:vendor/company/module/interfaces/ -randroid.hidl:system/libhidl/transport vendor.company.mylib@1.0 
hidl-gen -Landroidbp -rvendor.company:vendor/company/module/interfaces/ -randroid.hidl:system/libhidl/transport vendor.company.mylib@1.0   

vendor/company/module/interfaces/lib/1.0/default/MyService.cpp and MyService. h are autogened.

vendor/company/module/interfaces/lib/1.0/Android.bp is autogened.

 

(5)  create android.bp

vendor/company/module/interfaces/lib/Android.bp

// This is an autogenerated file, do not edit.
subdirs = [
    "1.0",
    "1.0/default",
]

(6) create service.cpp

vendor/company/module/interfaces/lib/1.0/default/service.cpp


#include <hidl/HidlTransportSupport.h>
#include <hidl/LegacySupport.h>
#include "MyService.h"

#define UNUSED(x) (void)(x) //宏定义,主要为了防止未使用的变量出现编译报错
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using vendor::company::lib::V1_0::implementation::MyService;
 
int main(){ 
    MyService ms;    
    configureRpcThreadpool(1, true /* callerWillJoin */);
    android::status_t status = ms.registerAsService(); //注册服务
    if (status != android::OK) {
      ALOGD("registerAsService myservice failed!");
      return -1;
    }
    ALOGD("registerAsService myservice success!");
    joinRpcThreadpool();
    return 0;
}

(7) create vendor.company.lib@1.0-service.rc


service my_hal_service /vendor/bin/hw/vendor.compnay.mylib@1.0-service
    class hal
    user system
    group system

(8) create vendor/company/module/interfaces/mylib/1.0/default/Android.bp

cc_binary {
    relative_install_path: "hw",
    defaults: ["hidl_defaults"],
    vendor: true,
    proprietary: true,
    name: "vendor.company.mylib@1.0-service",
    init_rc: ["vendor.company.mylib@1.0-service.rc"],
    srcs: 
        ["MyService.cpp",
        "service.cpp"],

    shared_libs: [
        "liblog",
        "libcutils",
        "libdl",
        "libbase",
        "libutils",
        "libhardware",
    ] + [
        "libhidlbase",
        "libhidltransport",
        "vendor.company.mylib@1.0",
    ],

}

(9) compile module

mmm vendor/company/module/interfaces/mylib/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值