下面分析一个文件hardware/libhardware/hardware.c,这个文件提供了一些函数,上层通过这些函数可以用来查找加载HAL库,
以及获取指定HAL库的模块变量;
load方法如下,
static int load(const char *id, const char *path,const struct hw_module_t **pHmi)
{
int status;
void *handle;
struct hw_module_t *hmi;
handle = dlopen(path, RTLD_NOW);
•••
这个接口是一个内部函数,逻辑如下:
1,首先先加载path指定的HAL动态库
2,然后通过下面的代码
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_module_t *)dlsym(handle, sym);
从动态库中获取模块名为HMI的模块, 在hardware/libhardware/include/hardware.h中有如下宏定义:
#define HAL_MODULE_INFO_SYM HMI
#define HAL_MODULE_INFO_SYM_AS_STR "HMI"
因此HAL模块变量必须定义成HAL_MODULE_INFO_SYM才能被正确获取;
3, 检测模块id是否匹配,匹配才能成功获取到模块变量
hw_module_exists方法如下,
static int hw_module_exists(char *path,