一、问题
下午花了几个小时看ONScripter on Android的代码
http://onscripter.sourceforge.jp/android/android.html
http://code.google.com/p/onscripter/
它是基于libsdl-android的
http://libsdl-android.sourceforge.net/
https://github.com/pelya/commandergenius/archives/sdl_android
我尝试把原有的ONScripter核心代码删除,只保留libsdl.so
然后用原有框架运行SDL代码包中的示例graywin(单击窗口画一个随机大小的灰色矩形),
如下图所示:
移植graywin的过程中发现以下问题:
1)DrawBox有时会突然退出程序
我把它改为矩形不越出舞台,这个问题就消除
(另外,貌似无法使用双缓冲模式,
虽然我执行了videoflags = SDL_DOUBLEBUF,但
screen->flags & SDL_DOUBLEBUF总是false
)
void DrawBox(SDL_Surface *screen, int X, int Y, int width, int height) { static unsigned int seeded = 0; SDL_Rect area; Uint32 color; Uint32 randc; __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 01"); /* Seed the random number generator */ if ( seeded == 0 ) { srand(time(NULL)); seeded = 1; } __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 02"); /* Get the bounds of the rectangle */ area.w = (rand()%width); area.h = (rand()%height); area.x = X-(area.w/2); area.y = Y-(area.h/2); if (area.x < 0) area.x = 0; if (area.y < 0) area.y = 0; if (area.x > width) area.x = width; if (area.y > height) area.y = height; if (area.x + area.w > width) area.w = width - area.x; if (area.y + area.h > height) area.h = height - area.y; randc = (rand()%NUM_COLORS); if (screen->format->BytesPerPixel==1) { color = randc; } else { color = SDL_MapRGB(screen->format, randc, randc, randc); } __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 03, %x", color); /* Do it! */ SDL_FillRect(screen, &area, color); __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 04"); if ( screen->flags & SDL_DOUBLEBUF ) { __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 05"); SDL_Flip(screen); } else { __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox 05 else, %d, %d, %d, %d", area.w, area.h, area.x, area.y); SDL_UpdateRects(screen, 1, &area); } __android_log_print(ANDROID_LOG_INFO, "libgraywin", "DrawBox end"); }
2)SDL_main入口被两次调用。
原来的代码中调用了两次SDL_main(在Java中的JNI接口是Video.java中的DemoRenderer类native函数nativeInit)
private native void nativeInit(String currentDirectoryPath, boolean oo, boolean dr);
第一次调用在构造函数,第二次调用在onDrawFrame
我把构造函数的那个调用注释掉。
二、总结
我猜测它的显示模块运行原理是
Java端:在SurfaceView中初始化OpenGL ES,然后通过JNI调用graywin的SDL_main(被宏替换掉的main函数)
JNI(C/C++)端:接收鼠标输入消息,然后调用OpenGL ES的C接口显示灰色矩形。
总体来说:
1. 比OpenGL要容易移植(代码改动很少)
2. JNI的代码实在很难调,所以移植这库的人应该是神级了。
3. 虽说SDL库和OpenGL一样是底层库(玩过SDL的人都知道,它没有画线的API)。
不过它用途较广泛(可以处理输入设备和音频输出),基于它的开源库似乎也较多些(更适合C开发者使用)。
相关推荐
记录了SDL库成功移植到s3c6410开发板上,很详细,帮你完成移植工作
android下移植的sdl库,版本是1.3的
将SDL的库一直到arm上,在此期间出现很多问题,但是最后还是被我突破了,gendarme家分享一下,将他解压放到相应位置就可以使用
SDL是Simple DirectMedia Layer 的缩写,是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要...本代码示例了在Android上SDL多点触控实现放大缩小的功能。
SDL Android下编译源码, SDL2.03, Eclipse下NDK 编译运行
SDL2.2.0.1的移植,包含SDL的每个参数的意思,包含交叉编译器的安装,包含移植过程中出错的处理方法。 --prefix=/usr/arm 安装SDL路径 --enable-shared=yes 构建共享库[开启] --enable-nasm 装配blitters x86上的...
Android程序SDL2类库使用说明 简单记录一下Android程序使用SDL2类库的方法。这部分的信息可以参考SDL2源代码目录中的README-android.txt文件。SDL2使用的步骤可以分为以下步骤:
SDL移植实验,我的嵌入式实验报告。SDL移植教程。已成功!
运行在Android之上的Go-SDL2示例
使用SDL 2.x和FFMPEG播放视频,简单的例子
SDL Android 例子源码可用工程,实测编译通过在模拟器运行(SDL 2.0 for Android),工程目录名叫AndroidTst2,编译通过可用, sdl source code for android android source code for sdl 2.0 这个工程的文件夹...
第二步:解压完成后进入ndk路径/build/tool/,开始配置环境,使用命令:sudo ./make-standalone-toolchain.sh -
在Android for ffmpeg+SDL2.0 的视频播放器demo,ffmpeg 2.6.1,测试本地视频播放正常,播放rtsp 丢包严重,出现花屏卡顿,如果有解决的可以交流下 ,共同学习!
在网络上搜索到的交叉编译指令,大多有错误并且通常难以...本文档综合了许多,详细系统的给出了SDL2及其扩展库的交叉编译方法。(本文档由于在linux环境下写成,所以打开时,可能会出现汉字乱码,但指令一定不会出错)
把ffmpeg 的ffplay 移植到 sdl2 上,并建立 vs2012 工程,方便研究学习 ffplay 的解码工作流程
游戏移植需要的开发板上的SDL库的配置,以及怎么样才能让游戏顺利的在板子上运行。看了之后会迎刃而解的。
Mini6410上移植SDL游戏的详细步骤,含有源代码,可以直接在mini6410上直接运行
可以完美播放视频 移植SDL和ffmepg到android上
android 播放器demo 需要配置eclipse NDK环境,修改代码main中播放的文件名,重新编译,即可。
SDL2.0.8版本,想要免费分享的不知道CSDN为什么限制最少2分。