Android应用调用Hal层,底层都是通过binder实现,
方式1、通过framework框架与native交互,从而和hal层进行交互
主要方式为注册系统服务,通过getSystemService(test)获取自定义系统服务,test通过注册jni和native交互,调用Hidl Service 从而和hal进行交互
方式2、应用通过HIDL和hal进行交互(如下例子)
自己实现jni模块,在应用内通过System.load(“test.so”),和hal进行交互
方式3、应用通过jni直接和hal进行交互
1、创建vendor/huawei/interface/lyx/1.0目录在该目录下创建相应HIDL接口和相应实现
ICallInterface.hal
package vendor.huawei.hardware.lyx@1.0;
interface ICallInterface{
clearRt(int32_tnum)generates(string ret);
};
2、使用HIDL-GEN工具生成相应实现系统定义的所有的.hal接口,都是通过hidl-gen工具转换成对应的代码。
hidl-gen源码路径:system/tools/hidl,是在ubuntu上可执行的二进制文件。
使用方法:hidl-gen-o output-path-L language(-r interface-root)fqname
例子:hidl-gen-o.-Lc++-impl-rvendor.huawei.hardware:vendor/huawei/interfaces-randroid.hidl:system/libhidl/transportvendor.huawei.hardware.lyx@1.0
参数说明:-L:语言类型,包括c++,c++-headers,c++-sources,export-header,c++-impl,java,java-constants,vts,makefile,androidbp,androidbp-impl,hash等。hidl-gen可根据传入的语言类型产生不同的文件。
fqname:完全限定名称的输入文件。比如本例中android.hardware.gunder@1.0,要求在源码目录下必须有vendor/huawei/interfaces/lyx/1.0/目录。对于单个文件来说,格式如下:package@version::fileName,比如android.hardware.gunder@1.0::types.Feature对于目录来说格式如下package@version比如android.hardware.gunder@1.0。
-r:格式package:path,可选,对fqname对应的文件来说,用来指定包名和文件所在的目录到Android系统源码根目录的路径。如果没有制定,前缀默认是:android.hardware,目录是Android源码的根目录。
-o:存放hidl-gen产生的中间文件的路径。生成的CallInterface.cpp和CallInterface.h复制到venodr/huawei/libhardware/lyx/1.0下
可在Android.bp定义
hidl_package_root {
name: "interface",
path: "vendor/huawei/interface",
}