0

私はAndroidのソースコードを学んでいます。そして、低レベルの関数がアプリケーションからどのように呼び出されているのかを知りたいです。

この側面で学習し​​ている間、私は今、私が以下に与えた1つのファイルを理解するのに苦労しています:

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_backlightているだけset_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リターンタイプとしてタイプ
  • そしてタイプの2つの引数を取る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

あなたが引用したのは、Androidエミュレーターでのdevice-driver実装です。lightsしたがって、int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);実際には関数ポインタ宣言です。これは、値を返すときにポインタとポインタを受け取るset_light関数へのポインタであることを意味します。light_device_tlight_state_tint

これは、Androidソースツリーの一般的な実装です。この実装は、潜在的にn異なるケースの一般的な実装を持つために使用されます。つまり、ケースに基づいて、別の関数を呼び出したい場合がありますが、この実装を通じて、設定方法と呼び出し方法は一般的に保たれます。

これがどこで呼び出されるかという次の質問に移ります。このソースファイルを参照してください。このファイルでは、デバイスはここでセットアップされ、参照されたopenメソッドを呼び出します。セットアップが完了して返されると、次に示すようdeviceに、実際のメソッドがメソッドで呼び出されますsetLight_native

于 2013-03-22T07:00:33.380 に答える
0
  1. これは、 という関数ポインタを宣言していますset_light。ポインターは、int を返し、2 つの構造体をパラメーターとして受け取る関数を指しています。

  2. 関数ポインタの値を設定しています。他の誰かが後で関数ポインタを使用してその関数を呼び出しますが、実際の関数が何であるかを知る必要はありません (これが関数ポインタの使用です)。このメソッドは、一般に「コールバック関数」と呼ばれます。

于 2013-03-22T06:44:16.230 に答える