我正在学习Android源代码。我想知道较低级别的函数如何从应用程序调用。
在这方面学习的同时,现在我正在努力理解我在下面给出的一个文件:
static int open_lights(const struct hw_module_t* module, char const* name,
struct hw_device_t** device)
{
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
set_light = set_light_backlight;
}
else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
set_light = set_light_keyboard;
}
else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
set_light = set_light_buttons;
}
else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
set_light = set_light_battery;
}
else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
set_light = set_light_notification;
}
else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
set_light = set_light_attention;
}
else {
return -EINVAL;
}
pthread_once(&g_init, init_globals);
struct light_device_t *dev = malloc(sizeof(struct light_device_t));
memset(dev, 0, sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version = 0;
dev->common.module = (struct hw_module_t*)module;
dev->common.close = (int (*)(struct hw_device_t*))close_lights;
dev->set_light = set_light;
*device = (struct hw_device_t*)dev;
return 0;
}
set_light_backlight(struct light_device_t* dev,
struct light_state_t const* state)
{
int err = 0;
int brightness = rgb_to_brightness(state);
pthread_mutex_lock(&g_lock);
err = write_int(LCD_FILE, brightness);
pthread_mutex_unlock(&g_lock);
return err;
}
我的问题是:
int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);
这句话是什么意思?set_light_backlight
分配给set_light
。然后如何set_light_backlight(struct light_device_t* dev, struct light_state_t const* state)
函数被调用?答案 0 :(得分:1)
int( set_light)的含义是什么(struct light_device_t dev,struct light_state_t const * state);
您需要了解函数指针是什么。
函数指针是一种指向函数的指针。取消引用时,它将调用它指向的函数并传递参数,就像正常的函数调用一样。
你的程序中有一个函数指针set_light
:
int
作为返回类型struct light_device_t*
and struct light_state_t const*
在您的程序中,取决于名称包含的内容,您将指定函数指针指向运行时下面给定函数的任何一个。
set_light = set_light_backlight;
或
set_light = set_light_keyboard;
或
set_light = set_light_buttons;
或
set_light = set_light_battery;
或
set_light = set_light_notification;
或
set_light = set_light_attention;
我们只是将set_light_backlight分配给set_light。那怎么可能呢 set_light_backlight(struct light_device_t * dev,struct light_state_t const * state)函数被调用?
通过调用set_light()
并使用所需参数调用函数set_light_backlight()
,如果已为其分配set_light()
。
答案 1 :(得分:0)
这是声明一个名为set_light
的函数指针。指针指向一个返回int的函数,并将两个结构作为参数。
您正在设置函数指针的值。其他人稍后会使用函数指针来调用该函数,而不需要知道实际函数是什么(这是函数指针的使用)。此方法通常称为“回调函数”。
答案 2 :(得分:0)
您引用的内容是Android模拟器中device-driver
的{{1}}实现。因此,lights
实际上是一个函数指针声明。这意味着int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);
是指向函数的指针,该函数在返回set_light
值时采用light_device_t
指针和light_state_t
指针。
这是Android源代码树中的典型实现。这个实现用于具有潜在int
个不同情况的通用实现,即基于一个案例,我可能想要调用一个不同的函数,但是我设置它的方式和我调用它的方式保持通用通过这种实施。
回到下一个问题,即调用它的位置。请参阅此source file。
在此文件中,设备设置为here,它将调用您引用的open方法。设置完成并返回n
后,将在device
方法中调用实际方法,如here所示。