如何成功运行SDL官方提供的Android平台的Demo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何成功运行SDL官方提供的Android平台的Demo相关的知识,希望对你有一定的参考价值。

您好,很高兴能帮助您,
第一步:准备SDL源代码包;
1. 去http://www.libsdl.org/官网下载最新版SDL2-2.0.3.tar.gz;
2. 解压后,可以在根目录下找到android-project目录和README-android.txt,前者是一个一个Android工程模板,后者是关于如何使用该工程的文档说明。
3. 调整目录,使其成为一个可编译的工程:
(1) 将android-project目录剪切到与SDL2-2.0.3同级的目录;
(2) 然后将SDL2-2.0.3目录拷贝到android-project\\jni目录下,并重命名为SDL;
第二步:为SDL增加main函数
(1) mainhttp://wiki.libsdl.org/Tutorials#Android.c文件可以从http://www.dinomage.com/wp-content/uploads/2013/01/main.c下载;
(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目录已经配置到环境变量PATH中去;
打开cmd命令窗口,进入到android-project目录,然后执行"ndk-build"命令进行编译。编译成功后会在android-project根目录下生成libs目录,下面有各个平台的需要的这两个so文件。
第四步:修改build target配置文件
默认的工程是使用的=android-12,必须使这个target与你系统配置的一致,否则编译会失败. 具体的配置位于android-project/project.properties和android-project/default.properties中。由于adt-bundle-windows-x86_64-20130729.zip包对应的是android-18,因此需要将这两个文件中的配置全部改为android-18.
第五步:导入Eclipse运行
依次选择File->New->Android->Android Project from Existing Code,然后选择android-project目录将工程文件导入到Eclipse中。
然后选择按照正常的Android工程运行即可。这个时候程序闪一下什么都没有,因为没有添加资源。可下载一个bmp图片放到android-project/assets中,这个目录是由eclipse自动生成的。然后运行就可以看到通过SDL渲染出来的图片了。这 里提供一个官方文档中提到的bmp地址:http://www.dinomage.com/wp-content/uploads/2013/01/image.bmp 。整个工程的源代码可以到我的github上去下载,地址:https://github.com/dennishucd/SDLActivity
你的采纳是我前进的动力,还有不懂的地方,请你继续“追问”!
如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助!
参考技术A 操作步骤:
第一步:准备SDL源代码包;
1. 去官网下载最新版SDL2-2.0.3.tar.gz;
2. 解压后,可以在根目录下找到android-project目录和README-android.txt,前者是一个一个Android工程模板,后者是关于如何使用该工程的文档说明。
3. 调整目录,使其成为一个可编译的工程:
(1) 将android-project目录剪切到与SDL2-2.0.3同级的目录;
(2) 然后将SDL2-2.0.3目录拷贝到android-project\jni目录下,并重命名为SDL;
第二步:为SDL增加main函数
(1) 下载wiki.libsdl.org/Tutorials#Android.c文件;
(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目录已经配置到环境变量PATH中去;
打开cmd命令窗口,进入到android-project目录,然后执行"ndk-build"命令进行编译。编译成功后会在android-project根目录下生成libs目录,下面有各个平台的需要的这两个so文件。
第四步:修改build target配置文件
默认的工程是使用的=android-12,必须使这个target与系统配置的一致,否则编译会失败. 具体的配置位于android-project/project.properties和android-project/default.properties中。由于adt-bundle-windows-x86_64-20130729.zip包对应的是android-18,因此需要将这两个文件中的配置全部改为android-18.
第五步:导入Eclipse运行
依次选择File->New->Android->Android Project from Existing Code,然后选择android-project目录将工程文件导入到Eclipse中。
然后选择按照正常的Android工程运行即可。这个时候程序闪一下什么都没有,因为没有添加资源。可下载一个bmp图片放到android-project/assets中,这个目录是由eclipse自动生成的。然后运行就可以看到通过SDL渲染出来的图片了。
参考技术B 前些天我也想看看API DEMO中的列子程序和效果
,但发现在eclipse中并不能直接导入API DEMO工程。

那么这样,在eclipse中先新建一个工程,注意,工程名,文件包目录结构和Activity名都和API DEMO中的名称一样,然后将API DEMO中的所有文件全部覆盖到你新建的工程中就可以了。

(其实,API DEMO中缺少工程必须的配置文件)

(SDL)一个简单的SDL视频文件播放程序

需要说明的是,对于新手需要在ubuntu系统安装SDL库安装包和开发安装包,可以参考官网的文章:

https://wiki.libsdl.org/Installation

SDL是跨平台的,下面的代码更改下#include路径,指引下连接lib库,就可以在windows上编译运行。

文章旨在快速运行一个example,具体SDL API需查看官方文档。

  1 #include "iostream"
  2 #include "SDL2/SDL.h"
  3 
  4 #define PIXEL_W 352
  5 #define PIXEL_H 288
  6 #define IMAGE_SIZE 152064 // 352 * 288 * 1.5
  7 
  8 #define REFRESH_EVENT (SDL_USEREVENT + 1) // 自定义事件,每40毫秒触发图像帧更新
  9 
 10 bool thread_exit = false;
 11 // 每40毫秒出发图像帧更新
 12 int refresh_video(void *opaque)
 13 {
 14     while (thread_exit == false)
 15     {
 16         SDL_Event event;
 17         event.type = REFRESH_EVENT;
 18         SDL_PushEvent(&event);
 19         std::cout << "push REFRESH_EVENT" << std::endl;
 20         SDL_Delay(40);
 21     }
 22 
 23     return 0;
 24 }
 25 
 26 int main(int argc, char **argv)
 27 {
 28     if (SDL_Init(SDL_INIT_VIDEO) == -1)
 29     {
 30         std::cout << SDL_GetError() << std::endl;
 31         return -1;
 32     }
 33 
 34     SDL_Window *sdlWindow = NULL;
 35     sdlWindow= SDL_CreateWindow("SDL example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, PIXEL_W, PIXEL_H, SDL_WINDOW_OPENGL);
 36     if (sdlWindow == NULL)
 37     {
 38         std::cout << SDL_GetError() << std::endl;
 39         return -1;
 40     }
 41 
 42     SDL_Renderer *sdlRenderer = NULL;
 43     sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
 44     if (sdlRenderer == NULL)
 45     {
 46         std::cout << SDL_GetError() << std::endl;
 47         return -1;
 48     }
 49 
 50     SDL_Texture *sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, PIXEL_W, PIXEL_H);
 51 
 52     FILE *fp = fopen("352_288_example.IYUV", "r");
 53     if (fp == NULL)
 54     {
 55         std::cout << "open file error" << std::endl;
 56         return -1;
 57     }
 58 
 59     char *pImageBuffer = (char *)malloc(IMAGE_SIZE);
 60     if (pImageBuffer == NULL)
 61     {
 62         std::cout << "malloc image buffer error" << std::endl;
 63         return -1;
 64     }
 65 
 66     memset(pImageBuffer, 0x00, IMAGE_SIZE);
 67 
 68     SDL_Rect sdlRect;
 69     sdlRect.x = 0;
 70     sdlRect.y = 0;
 71     sdlRect.w = PIXEL_W;
 72     sdlRect.h = PIXEL_H;
 73 
 74     SDL_Event event;
 75     SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video, NULL, NULL);
 76 
 77     while(1)
 78     {
 79         std::cout << "waiting event..." << std::endl;
 80         SDL_WaitEvent(&event);
 81         if (event.type == REFRESH_EVENT)
 82         {
 83             std::cout << "get REFRESH_EVENT." << std::endl;
 84             if (fread(pImageBuffer, 1, IMAGE_SIZE, fp) != IMAGE_SIZE)
 85             {
 86                 fseek(fp, 0, SEEK_SET);
 87                 fread(pImageBuffer, 1, IMAGE_SIZE, fp);
 88             }
 89 
 90             SDL_UpdateTexture(sdlTexture, NULL, pImageBuffer, PIXEL_W);
 91             SDL_RenderClear(sdlRenderer);
 92             SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
 93             SDL_RenderPresent(sdlRenderer);
 94         }
 95         else if (event.type == SDL_QUIT)
 96         {
 97             std::cout << "get QUIT." << std::endl;
 98             break;
 99         }
100         else
101         {
102             std::cout << event.type << std::endl;
103         }
104     }
105 
106     thread_exit = true;
107     return 0;
108 }

sample所用的视频文件可以在这里下载:

 https://pan.baidu.com/s/1LyxdBEO3kFi3bLzVnyKJQw

以上是关于如何成功运行SDL官方提供的Android平台的Demo的主要内容,如果未能解决你的问题,请参考以下文章

例外:SDL2:无法加载图像 - 在 android 上运行 kivy apk 时

无法为 Android 构建 SDL2

基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

(SDL)一个简单的SDL视频文件播放程序

SDL 3D 平台一致性

让 Dbus 的 Java 绑定在 Android 上运行