一、问题
下午花了几个小时看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(Simple DirectMedia Layer)库移植到ARM架构的硬件平台上,这是一个常见的挑战,特别是在嵌入式系统和移动设备开发中。SDL是一个跨平台的多媒体库,它提供了丰富的功能,如图形...
本文将详细介绍如何在Linux环境下配置Android SDL(Simple DirectMedia Layer)的开发环境,并进行编译。 首先,确保你的Linux系统安装了必要的开发工具,包括Doxygen(文档生成工具)、Mscgen(流程图生成工具)、...
本教程将详细讲解如何在Android上移植并使用版本为1.3的SDL库,借助Android NDK(Native Development Kit)来实现。 首先,了解Android NDK的基本概念。NDK是Google提供的一套工具,允许开发者在Android应用中使用C...
记录了SDL库成功移植到s3c6410开发板上,很详细,帮你完成移植工作
SDL2.2.0.1的移植,包含SDL的每个参数的意思,包含交叉编译器的安装,包含移植过程中出错的处理方法。 --prefix=/usr/arm 安装SDL路径 --enable-shared=yes 构建共享库[开启] --enable-nasm 装配blitters x86上的...
在Android应用中集成SDL,你需要准备一个SDL的Android移植版本,如SDL 2.x。然后,在Android项目中导入SDL库和FFmpeg库的静态或动态链接库。 接下来,我们需要创建一个Android项目,并在其中设置JNI(Java Native ...
SDL是Simple DirectMedia Layer 的缩写,是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要...本代码示例了在Android上SDL多点触控实现放大缩小的功能。
在Ubuntu环境下,搭建Android系统的开发和编译环境通常需要安装一系列必要的软件包,如Git、Java JDK 5.0(因为Android编译不支持高版本的Java)、Flex、Bison、Gperf、SDL库、EsounD库、构建工具链、Zlib、Curl、...
通过这个示例,开发者可以学习到如何在Android平台上使用Go语言和SDL2开发游戏或图形应用。这个过程涉及到Go语言的基础知识、SDL2的使用、Android的NDK和JNI技术,以及交叉编译和打包流程。对于想要结合Go语言的效率...
通过学习如何在不同操作系统(如Windows、Linux、Mac OS X、Android和iOS)上移植SDL程序,开发者可以将他们的作品带到各种设备上。 9. **游戏开发应用** 掌握了SDL的基本知识后,可以进一步学习如何用它来开发...
在Android平台上,SDL (Simple DirectMedia Layer) 是一个流行的开源跨平台开发库,它为游戏、多媒体和其他实时应用程序提供底层访问图形、音频和输入设备。本文将深入探讨如何在Android环境下编译和运行SDL源码,...
在“ffmpeg + sdl 2.0 实现android 播放器”这个项目中,你需要首先确保已经为Eclipse配置了Android NDK环境。NDK是Android的Native Development Kit,允许开发者用C和C++编写原生代码,以提高性能和处理特定硬件...
Android程序SDL2类库使用说明 简单记录一下Android程序使用SDL2类库的方法。这部分的信息可以参考SDL2源代码目录中的README-android.txt文件。SDL2使用的步骤可以分为以下步骤:
在Android平台上,结合SDL2.0(Simple DirectMedia Layer)库,可以实现高效的音视频播放功能。这篇内容将深入探讨如何在Android上构建一个基于FFmpeg和SDL2.0的视频播放器Demo,以及可能遇到的问题及其解决方案。 ...
综上所述,这个压缩包提供了适用于Android平台且专为armv7a架构优化的SDL2.0动态库,对于需要在Android上使用SDL2.0进行游戏或其他多媒体应用开发的开发者来说,这是一个非常实用的资源。正确集成和使用这些.so文件...
文件“android-project”很可能是一个示例项目或者已经包含了移植后的SDL和FFmpeg的Android工程,它可能包含所有必要的配置文件、源代码、资源和库文件,供开发者参考学习或者直接用于自己的项目。 总的来说,将SDL...
SDL Android 例子源码可用工程,实测编译通过在模拟器运行(SDL 2.0 for Android),工程目录名叫AndroidTst2,编译通过可用, sdl source code for android android source code for sdl 2.0 这个工程的文件夹...
标题中的“开发板上移植SDL游戏的详细步骤”意味着我们将探讨如何将基于Simple DirectMedia Layer (SDL)的游戏软件从一个常规平台移植到嵌入式开发板上,例如Mini6410。SDL是一个跨平台的多媒体库,常用于游戏开发,...
【SDL2及其扩展库交叉编译移植】 在嵌入式开发或者移动设备应用开发中,经常需要将软件移植到不同的硬件平台,这时就需要进行交叉编译。SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,用于处理图形、...