一、android 的jni 层是使用 hw_get_module 查找相应的so和加载。
二、来看hw_get_module 的代码 hardware\libhardware\hardware.c。
int hw_get_module_by_class(const char *class_id, const char *inst,
const struct hw_module_t **module)
{
int i = 0;
char prop[PATH_MAX] = {0};
char path[PATH_MAX] = {0};
char name[PATH_MAX] = {0};
char prop_name[PATH_MAX] = {0};
if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);
/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new copy of the library).
* We also assume that dlopen() is thread-safe.
*/
/* First try a property specific to the class and possibly instance */
snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name);
if (property_get(prop_name, prop, NULL) > 0) {
if (hw_module_exists(path, sizeof(path), name, prop) == 0) {
goto found;
}
}
/* Loop through the configuration variants looking for a module */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT; i++) {
if (property_get(variant_keys[i], prop, NULL) == 0) {
continue;
}
if (hw_module_exists(path, sizeof(path), name, prop) == 0) {
goto found;
}
}
/* Nothing found, try the default */
if (hw_module_exists(path, sizeof(path), name, "default") == 0) {
goto found;
}
return -ENOENT;
found:
/* load the module, if this fails, we're doomed, and we should not try
* to load a different variant. */
return load(class_id, path, module);
}
const static hw_module_t* s_gralloc_module = NULL;
int hw_get_module(const char *id, const struct hw_module_t **module)
{
int ret = 0;
if ( 0 == strcmp(id, GRALLOC_HARDWARE_MODULE_ID) )
{
if (NULL != s_gralloc_module )
{
*module = s_gralloc_module;
return 0;
}
}
ret = hw_get_module_by_class(id, NULL, module);
if ( 0 == strcmp(id, GRALLOC_HARDWARE_MODULE_ID) )
{
s_gralloc_module = *module;
}
return ret;
}
三、编译出来的so库名一定是MODULE_ID+default.so的形式,不然会找不到,我之前一直以为只要是xxx.default.so的形式就好,实际调试的时候发现不能乱修改这个名称。