研究port libSDL至android(1)中,我们看见port SDL至android中,需要关心的文件有这么几类:
  1. include下的三个文件
     image
  2. src/audio目录下的两个文件
    image
  3. src/video目录下的两个文件
    image
  4. src/audio/android下的两个文件
    image
  5. src/video/android下的三个文件
    image

第1类在前篇文章中已经分析过,这篇文章主要关心第2和3类;

  1. src/audio/SDL_sysaudio.h
    在该文件里添加了以下代码:

    #if SDL_AUDIO_DRIVER_ANDROID
    extern AudioBootStrap ANDROIDAUD_bootstrap;
    #endif

    SDL_AUDIO_DRIVER_ANDROID在include/SDL_config_android.h里定义;AudioBootStrap是个结构类型,在SDL_sysaudio.h中被定义了,如下:

    typedef struct AudioBootStrap {
        const char *name;
        const char *desc;
        int (*available)(void);
        SDL_AudioDevice *(*create)(int devindex);
    } AudioBootStrap;
    包含两个字符指针,和两个函数指针;ANDROIDAUD_bootstrap是个AudioBootStrap类型的变量,它在src/audio/android/SDL_androidaudio.c中被定义和初始化了,如下:

    AudioBootStrap ANDROIDAUD_bootstrap = {
        ANDROIDAUD_DRIVER_NAME, "SDL Android audio driver",
        ANDROIDAUD_Available, ANDROIDAUD_CreateDevice
    };

  2. src/audio/SDL_audio.c
    在该文件中添加了如下代码:

    #if SDL_AUDIO_DRIVER_ANDROID
        &ANDROIDAUD_bootstrap,
    #endif
    和src/audio/SDL_sysaudio.h的改动大同小异,前者将变量ANDROIDAUD_bootstrap的地址传入数组bootstrap中,后者将变量ANDROIDAUD_bootstrap放入头文件供其他文件引用
    image

  3. src/video/SDL_sysvideo.h
    该文件里添加了如下代码:

    #if SDL_VIDEO_DRIVER_ANDROID
    extern VideoBootStrap ANDROID_bootstrap;
    #endif
    可见改动和src/audio/SDL_sysaudio.h的改动是类似的,SDL_VIDEO_DRIVER_ANDROID在include/SDL_config_android.h里定义;VideoBootStrap也是个结构类型,在SDL_sysvideo.h中被定义,如下:

    typedef struct VideoBootStrap {
        const char *name;
        const char *desc;
        int (*available)(void);
        SDL_VideoDevice *(*create)(int devindex);
    } VideoBootStrap;
    包含两个字符指针,和两个函数指针;ANDROID_bootstrap是个VideoBootStrap类型的变量,它在src/video/android/SDL_androidvideo.c中被定义和初始化了,如下:

    VideoBootStrap ANDROID_bootstrap = {
        ANDROIDVID_DRIVER_NAME, "SDL android video driver",
        ANDROID_Available, ANDROID_CreateDevice
    };

  4. src/video/SDL_video.c
    在该文件中添加了如下代码:

    #if SDL_VIDEO_DRIVER_ANDROID
        &ANDROID_bootstrap,
    #endif
    和src/video/SDL_sysvideo.h的改动大同小异,前者将变量ANDROID_bootstrap的地址传入数组bootstrap中,后者将变量ANDROID_bootstrap放入头文件供其他文件引用
    image

总结一下,

  1. 主要关注两个结构类型:AudioBootStrapVideoBootStrap以及它们的变量ANDROIDAUD_bootstrapANDROID_bootstrap的初始化。
  2. 从初始化中,又要特别关注他们的两个函数指针被初始化成几个函数
    • ANDROIDAUD_Available, ANDROIDAUD_CreateDevice
    • ANDROID_Available, ANDROID_CreateDevice
Advertisements