0

我正在学习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;
}

我的问题是:

  1. 这句话的含义是什么int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);
  2. 我们只是分配set_light_backlightset_light. 那么如何set_light_backlight(struct light_device_t* dev, struct light_state_t const* state) 调用函数呢?
4

3 回答 3

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()分配给它,则调用函数。

于 2013-03-22T06:58:32.823 回答
0
  1. 这是声明一个名为set_light. 指针指向一个函数,该函数返回一个 int 并接受两个结构作为参数。

  2. 您正在设置函数指针的值。其他人稍后将使用函数指针来调用该函数,而无需知道实际函数是什么(即使用函数指针)。这种方法通常被称为“回调函数”。

于 2013-03-22T06:44:16.230 回答
0

您引用的是Android Emulator 中的device-driver实现。lights因此,int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);实际上是一个函数指针声明。这意味着set_light一个指向函数的指针,该函数在返回值时采用light_device_t指针和指针。light_state_tint

这是 Android 源代码树中的典型实现。此实现用于为可能n不同的情况提供通用实现,即基于一个案例,我可能想要调用不同的函数,但我设置它的方式和调用它的方式,通过此实现保持通用。

来到你的下一个问题,这是在哪里调用的。请参考这个源文件。在此文件中,设备在此处设置,它将调用您引用的 open 方法。设置完成并返回后,将device方法中调用实际方法setLight_native,如下所示。

于 2013-03-22T07:00:33.380 回答