Android Java/C++引用hal接口开发

在编写hal层接口之后,一般我们可以在C/C++或者Java模块中进行引用,或者提供给第三方,本文将说明如何开发一个hal模块,以及如何获取开发时C/C++模块需要导入的头文件,或者Java模块需要导入的jar包,这样一来将头文件或者jar导入工程可以方便我们进行开发。

  1. 编写hal层接口可以查阅: [Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(一)——服务端

  2. 为hal服务添加selinux权限:[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(二)——踩坑篇
    记得添加selinux目录到编译目标中,例如:

    1748501155400.png

  3. 添加Vintf声明:[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端 Vintf需要两个声明
    3.1 系统期望框架满足的接口:https://source.android.google.cn/docs/core/architecture/vintf/comp-matrices?hl=zh-cn
    声明文件:

    image.png

    导入到编译目标
    1748510323941.png

    3.2 框架提供的接口:https://source.android.google.cn/docs/core/architecture/vintf/objects?hl=zh-cn#manifest-fragments

在编写hal服务模块的时候可以添加:


1748509971259.png

1748510501604.png
  1. 按照提示编写好hal接口文件以及Andorid.bp(如果需要生成java引用的jar包,记得添加gen_java: true)后
    image.png

    1748419368387.png

    在需要引用的模块中进行引用,例如:

java模块中(注意java模块中对应的版本写法:xxx-V1.0-java):

1748419742372.png

C/C++模块中(典型例子是hal接口的实现模块,如下图所示):


1748420148370.png

写好之后,单编对应的java模块/C/C++模块,模块所依赖的hal接口的jar包以及C/C++头文件也就编译出来了,当然也可以单编hal接口模块,但是实测默认只生成hal接口的.so文件,不编译jar以及头文件出来,需要编译引用了hal接口的模块才会编译出来,例如如果编译C/C++模块,就可以找到类似的目录:

image.png

其中 _genc++结尾的是生成的C文件,_genc++_headers自然就是头文件了,这样在C/C++模块中导入这些头文件就可以愉快的开发了。
同理,如果单编java模块,会生成:
1748425049800.png

其中有java客户端可以导入的jar包。

当然客户端使用接口的过程中还是有可能报selinux错误,例如我这里在system_app中调用hal:

denied  { find } for interface=vendor.xxx.hardware.boardinfo::IBoard sid=u:r:system_app:s0 pid=3675 scontext=u:r:system_app:s0 tcontext=u:object_r:board_hal_service:s0 tclass=hwservice_manager permissive=0

这个添加相应的seliunx规则即可,这里不再赘述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容