`

Android SDL移植版学习笔记

 
阅读更多

一、问题

下午花了几个小时看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开发者使用)。

 

  • 大小: 46.3 KB
分享到:
评论

相关推荐

    SDL移植所有的库,一直到arm上

    在本文中,我们将深入探讨如何将SDL(Simple DirectMedia Layer)库移植到ARM架构的硬件平台上,这是一个常见的挑战,特别是在嵌入式系统和移动设备开发中。SDL是一个跨平台的多媒体库,它提供了丰富的功能,如图形...

    Android sdl环境配置与编译1

    本文将详细介绍如何在Linux环境下配置Android SDL(Simple DirectMedia Layer)的开发环境,并进行编译。 首先,确保你的Linux系统安装了必要的开发工具,包括Doxygen(文档生成工具)、Mscgen(流程图生成工具)、...

    android ndk 移植的sdl-1.3

    本教程将详细讲解如何在Android上移植并使用版本为1.3的SDL库,借助Android NDK(Native Development Kit)来实现。 首先,了解Android NDK的基本概念。NDK是Google提供的一套工具,允许开发者在Android应用中使用C...

    SDL库移植笔记

    记录了SDL库成功移植到s3c6410开发板上,很详细,帮你完成移植工作

    SDL2-2.0.1移植

    SDL2.2.0.1的移植,包含SDL的每个参数的意思,包含交叉编译器的安装,包含移植过程中出错的处理方法。 --prefix=/usr/arm 安装SDL路径 --enable-shared=yes 构建共享库[开启] --enable-nasm 装配blitters x86上的...

    FFMPEG和SDL播放视频(Android)

    在Android应用中集成SDL,你需要准备一个SDL的Android移植版本,如SDL 2.x。然后,在Android项目中导入SDL库和FFmpeg库的静态或动态链接库。 接下来,我们需要创建一个Android项目,并在其中设置JNI(Java Native ...

    Android SDL放大缩小

    SDL是Simple DirectMedia Layer 的缩写,是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要...本代码示例了在Android上SDL多点触控实现放大缩小的功能。

    Android系统移植技术详解

    在Ubuntu环境下,搭建Android系统的开发和编译环境通常需要安装一系列必要的软件包,如Git、Java JDK 5.0(因为Android编译不支持高版本的Java)、Flex、Bison、Gperf、SDL库、EsounD库、构建工具链、Zlib、Curl、...

    Android-运行在Android之上的Go-SDL2示例

    通过这个示例,开发者可以学习到如何在Android平台上使用Go语言和SDL2开发游戏或图形应用。这个过程涉及到Go语言的基础知识、SDL2的使用、Android的NDK和JNI技术,以及交叉编译和打包流程。对于想要结合Go语言的效率...

    SDL Android下编译源码

    在Android平台上,SDL (Simple DirectMedia Layer) 是一个流行的开源跨平台开发库,它为游戏、多媒体和其他实时应用程序提供底层访问图形、音频和输入设备。本文将深入探讨如何在Android环境下编译和运行SDL源码,...

    ffmpeg +sdl 2.0 实现android 播放器 (eclipse 工具)

    在“ffmpeg + sdl 2.0 实现android 播放器”这个项目中,你需要首先确保已经为Eclipse配置了Android NDK环境。NDK是Android的Native Development Kit,允许开发者用C和C++编写原生代码,以提高性能和处理特定硬件...

    最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld

    Android程序SDL2类库使用说明 简单记录一下Android程序使用SDL2类库的方法。这部分的信息可以参考SDL2源代码目录中的README-android.txt文件。SDL2使用的步骤可以分为以下步骤:

    Android版本的ffmpeg+SDL2.0的demo

    在Android平台上,结合SDL2.0(Simple DirectMedia Layer)库,可以实现高效的音视频播放功能。这篇内容将深入探讨如何在Android上构建一个基于FFmpeg和SDL2.0的视频播放器Demo,以及可能遇到的问题及其解决方案。 ...

    SDL2.0 安卓使用的so库文件

    综上所述,这个压缩包提供了适用于Android平台且专为armv7a架构优化的SDL2.0动态库,对于需要在Android上使用SDL2.0进行游戏或其他多媒体应用开发的开发者来说,这是一个非常实用的资源。正确集成和使用这些.so文件...

    SDL ffmepg android

    文件“android-project”很可能是一个示例项目或者已经包含了移植后的SDL和FFmpeg的Android工程,它可能包含所有必要的配置文件、源代码、资源和库文件,供开发者参考学习或者直接用于自己的项目。 总的来说,将SDL...

    SDL中文学习手册(全)

    通过学习如何在不同操作系统(如Windows、Linux、Mac OS X、Android和iOS)上移植SDL程序,开发者可以将他们的作品带到各种设备上。 9. **游戏开发应用** 掌握了SDL的基本知识后,可以进一步学习如何用它来开发...

    SDL Android 例子源码可用工程,实测编译通过在模拟器运行(SDL 2.0 for Android)Eclipse

    SDL Android 例子源码可用工程,实测编译通过在模拟器运行(SDL 2.0 for Android),工程目录名叫AndroidTst2,编译通过可用, sdl source code for android android source code for sdl 2.0 这个工程的文件夹...

    开发板上移植SDL游戏的详细步骤

    标题中的“开发板上移植SDL游戏的详细步骤”意味着我们将探讨如何将基于Simple DirectMedia Layer (SDL)的游戏软件从一个常规平台移植到嵌入式开发板上,例如Mini6410。SDL是一个跨平台的多媒体库,常用于游戏开发,...

    SDL2及其扩展库交叉编译移植

    【SDL2及其扩展库交叉编译移植】 在嵌入式开发或者移动设备应用开发中,经常需要将软件移植到不同的硬件平台,这时就需要进行交叉编译。SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,用于处理图形、...

Global site tag (gtag.js) - Google Analytics