android studio 2.3 编译运行运行SDL 2.05 Demo



  本篇日期:2017-3-5
  基本环境:
  1. 操作系统:Windows10  64位;
  2. Android Studio 2.3,64位。
  3. Android NDK开发包:直接使用Android Studio安装NDK。(需要梯子)
  
  操作步骤:
  第一步:准备SDL源代码包;
  1. 去http://www.libsdl.org/官网下载最新版SDL2-2.0.5
  2. 解压后,可以在根目录下找到android-project目录。
  3. 调整目录,使其成为一个可编译的工程:
      (1) 将android-project目录剪切到与SDL2-2.0.5同级的目录;
      (2) 然后将SDL2-2.0.5目录拷贝到android-project\jni目录下,并重命名为SDL;
  第二步:为SDL增加main函数
  1、main.c文件,可以从http://www.dinomage.com/wp-content/uploads/2013/01/main.c下载;文件内容如下:
  

#include 
  #include 
  #include 
  
  #include "SDL.h"
  
  typedef struct Sprite
  {
   SDL_Texture* texture;
   Uint16 w;
   Uint16 h;
  } Sprite;
  
  /* Adapted from SDL's testspriteminimal.c */
  Sprite LoadSprite(const char* file, SDL_Renderer* renderer)
  {
   Sprite result;
   result.texture = NULL;
   result.w = 0;
   result.h = 0;
   
      SDL_Surface* temp;
  
      /* Load the sprite image */
      temp = SDL_LoadBMP(file);
      if (temp == NULL)
   {
          fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
          return result;
      }
      result.w = temp->w;
      result.h = temp->h;
  
      /* Create texture from the image */
      result.texture = SDL_CreateTextureFromSurface(renderer, temp);
      if (!result.texture) {
          fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
          SDL_FreeSurface(temp);
          return result;
      }
      SDL_FreeSurface(temp);
  
      return result;
  }
  
  void draw(SDL_Window* window, SDL_Renderer* renderer, const Sprite sprite)
  {
   int w, h;
   SDL_GetWindowSize(window, &w, &h);
   SDL_Rect destRect = {w/2 - sprite.w/2, h/2 - sprite.h/2, sprite.w, sprite.h};
   /* Blit the sprite onto the screen */
   SDL_RenderCopy(renderer, sprite.texture, NULL, &destRect);
  }
  
  int main(int argc, char *argv[])
  {
      SDL_Window *window;
      SDL_Renderer *renderer;
  
      if(SDL_CreateWindowAndRenderer(0, 0, 0, &window, &renderer) < 0)
          exit(2);
  
   Sprite sprite = LoadSprite("image.bmp", renderer);
      if(sprite.texture == NULL)
          exit(2);
  
      /* Main render loop */
      Uint8 done = 0;
      SDL_Event event;
      while(!done)
   {
          /* Check for events */
          while(SDL_PollEvent(&event))
    {
              if(event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN)
     {
                  done = 1;
              }
          }
    
    
    /* Draw a gray background */
    SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
    SDL_RenderClear(renderer);
    
    draw(window, renderer, sprite);
   
    /* Update the screen! */
    SDL_RenderPresent(renderer);
    
    SDL_Delay(10);
      }
  
      exit(0);
  }


  2、下载之后将其放入android-project\jni\src目录;
  3、将main.c加入android-project\jni\src\Android.mk: 在Android.mk中默认有个YourSourceHere.c,将其替换为main.c即可;
  
  第三步:编译libSDL2.so和libmain.so
  注意:请确认NDK的bin目录(安装默认安装是:C:\Users\user\AppData\Local\Android\sdk\ndk-bundle)已经配置到环境变量PATH中去;
  打开cmd命令窗口,进入到android-project目录,然后执行"ndk-build"命令进行编译。
  【坑】执行ndk-build将会出现一堆报错信息,能后死翘翘。应当执行ndk-build -i进行编译。
  编译成功后会在android-project根目录下生成libs目录,下面有各个平台(注:只会生成armeabi-v7a 和x86 2个平台的)的需要的这两个so文件。

  第四步:导入Android Studio运行
  如果是在工程打开状态,选择File->Close Project。之后,选择”Import project(Eclipse ADT,Gradle,etc)”,然后选择android-project目录将工程文件导入到Andriod Studio中。
  【坑】这样之后,按编译将出现若干错误,能后死翘翘。错误英文提示大意是这个工程里面有C/C++代码,应当使用cmake或者ndk编译。解决办法是,在andriod studio面板的Gradle Script -> build.gradle(Module:app),在buildTypes{……}的后面,加上这段:
sourceSets.main {
    jniLibs.srcDir 'libs'
    jni.srcDirs = []
}
  然后选择按照正常的Android工程运行即可。这个时候程序闪一下什么都没有,因为没有添加资源。
  下载一个bmp图片,提供一个官方文档中提到的bmp地址:http://www.dinomage.com/wp-content/uploads/2013/01/image.bmp。
  到Andriod Studio面板,选择app,按右键,New->Folder->Assets Folder,再将下载的image.bmp放到这个目录下,重新编译运行这个apk,这个就是SDL 2.05的hello world了。
  
  本篇主要参考了如下搏文:
  如何成功运行SDL官方提供的Android平台的Demo :
  http://blog.csdn.net/gobitan/article/details/24771311

你可能感兴趣的:(sdl,android,studio,windows)