前面的两篇文章分别讨论了第1/2/3类文件,这里要讨论的是第4/5类文件,即:

  • src/audio/android下的两个文件
     image
  • src/video/android下的三个文件
     image

    先看Video部分,共三个:SDL_androidvidio.h, SDL_androidvidio.c, SDL_androidinput.c.

    1. SDL_androidvidio.h做的事情有这么3项
      #include "../SDL_sysvideo.h"
      声明两个函数ANDROID_InitOSKeymap(_THIS),和ANDROID_PumpEvents(_THIS)
      定义了枚举类型 KEYCODES_ANDROID
    2. SDL_androidinput.c,看名字就是处理android的input代码,比如键盘,trackball,mouse和accelerometer等,有这么几个函数
      • AccelerometerReader_nativeAccelerometer
      • DemoGLSurfaceView_nativeMouse
      • DemoGLSurfaceView_nativeKey
        这三个都是JNI函数,供java代码来调用的;
        AccelerometerReader,DemoGLSurfaceView均为类名;
        nativeAccelerometer是AccelerometerReader的java method;
        nativeMouse,nativeKey是DemoGLSurfaceView看得见的java method。
      • TranslateKey
      • ANDROID_InitOSKeymap
      • processAndroidTrackballKeyDelays
        这三个却是供SDL内部使用的
    3. SDL_androidvideo.c是重头戏,前面提到的ANDROID_Available,和ANDROID_CreateDevice都在这里实现,除此以外,还有这么一些函数的实现
      • ANDROID_DeleteDevice
      • ANDROID_VideoInit
      • ANDROID_ListModes
      • ANDROID_SetVideoMode
      • ANDROID_SetColors
      • ANDROID_UpdateRects
      • ANDROID_VideoQuit
      • ANDROID_AllocHWSurface
      • ANDROID_LockHWSurface
      • ANDROID_UnlockHWSurface
      • ANDROID_FlipHWSurface
      • ANDROID_FreeHWSurface
      • ANDROID_GL_SwapBuffers
        这些函数被实现后,都在函数ANDROID_CreateDevice中被初始化到device变量里,即创建android video device即是返回SDL_VideoDevice指针类型变量device,且初始化device的member function pointer为上述函数
      • DemoRenderer_nativeResize
      • DemoRenderer_nativeDone
      • DemoRenderer_nativeInitJavaCallbacks
        这么三个是JNI函数,DemoRenderer是类名,nativeResize,nativeDone和nativeInitJavaCallbacks是DemoRenderer看得见的java method。
        比较有意思的是DemoRenderer_nativeInitJavaCallbacks(…),因为它回调了它的java类DemoRenderer的方法swapbuffers,看代码
      • void JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv*  env, jobject thiz )
        {
            char classPath[1024];
            JavaEnv = env;
            JavaRenderer = thiz;
            JavaRendererClass = (*JavaEnv)->GetObjectClass(JavaEnv, thiz);    //thiz其实就是DemoRenderer的一个object
            JavaSwapBuffers = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "swapBuffers", "()I");  //取得DemoRenderer的method swapBuffers的ID,存在JavaSwapBuffers里
        }

      • 如何使用JavaSwapBuffers 呢?
      • int CallJavaSwapBuffers()
        {
            return (*JavaEnv)->CallIntMethod( JavaEnv, JavaRenderer, JavaSwapBuffers );
        }
        CallJavaSwapBuffers在ANDROID_FlipHWSurface(…)里被调用了

    以上为video部分的简略阅读,再来看audio部分具体有哪些内容;共有两个文件:SDL_androidaudio.h,SDL_androidaudio.c。

    1. SDL_androidaudio.h的工作有这么几项
    2. #include "../SDL_sysaudio.h"
      定义了结构类型 struct SDL_PrivateAudioData

    3. SDL_androidaudio.c的工作其实和SDL_androidvideo.c类似,ANDROIDAUD_Available和ANDROIDAUD_CreateDevice都在这里实现,且ANDROIDAUD_CreateDevice要返回一个SDL_AudioDevice指针类型变量this,SDL_AudioDevice定义的成员指针被初始化为下列预先实现好的函数
      • ANDROIDAUD_OpenAudio
      • ANDROIDAUD_WaitAudio
      • ANDROIDAUD_PlayAudio
      • ANDROIDAUD_GetAudioBuf
      • ANDROIDAUD_CloseAudio
      • ANDROIDAUD_DeleteDevice

        除此以外,还有其他一些JNI函数,也在这里被实现,具体什么含义估计得等到进入这层工作时才开始深入研究吧。

      • AudioThread_nativeAudioInit
      • AudioThread_nativeAudioInit2
      • AudioThread_nativeAudioBufferLock
      • AudioThread_nativeAudioBufferUnlock
    Advertisements