- 浏览: 14481 次
最新评论
[转载]Android原生(Native)C开发之四:SDL移植笔记
2011年06月12日
SDL(Simple DirectMedia Layer)是一套开放源码的跨平台多媒体开发库,使用C语言写成。SDL提供了多种图像、声音、键盘等的实现,可配置性与移植性非常高,开发者可以开发出跨多个平台(Linux、Windows、Mac OS X、Symbian、Widnows Mobiel等嵌入式系统,当然也包括今天要移植的平台:Android)的应用,目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用。
目前,SDL的稳定版本是 1.2.13,1.3还在开发中,可以通过SVN得到最新的代码,本次移植以 1.2.13为准,没有测试 1.3版的源码。请从 SDL 的官方网站下载 1.2.13 的源码,文件名为:SDL-1.2.13.zip,并解压,将得到一个 SDL-1.2.13 目录。
在Native编译SDL之前,要先装 Code Sourcery公司的arm交叉编译器,如果是用Windows操作系统,则一定要装 Cygwin(一个在windows上模拟linux的软件),因为在编译时要用到一些 linux命令,具体的步骤请参见:Port SDL/TinySDGL to android with native C,或自已在网上搜一些资料。
因为SDL是用纯C写的一套类库,所以移植性非常好,官方支持的系统有:Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX,非官方支持的有:AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, and OS/2,而且网上也有人将SDL移植到很多其他嵌入式系统,甚至有人将SDL移植到 Moto A1200,如此强大的可移植性,其架构真是值得好好学习。
现在切入正题,如何为Android量身定做一个 SDL,下面就从视频,音频,输入事件,定时器(video,audio,events[key,mouse],timer),多线程等几个方面来分析:
1.首先讲视频方面,Android是一个定制的Linux操作系统,Linux显示要么用 X11,要么用framebuffer技术,很显然Android并没有集成 X11(也许Android的软件界面是基于X11的?!),那只有唯一的选择:framebuffer!
打开$SDL/src/video目录,可以发现SDL支持多达30多种的视频显示技术,其中包括我们想要的fbcon及directfb,directfb我没有做测试,也许显示效果会比linux自带的fbcon好,有兴趣的朋友可以试一下,成功了别忘了告诉我;
2.再来谈音频,记得一个广告词:没有声音,再好的戏也出不来!可见音频对多媒体应用的重要性。
这次用的是OSS的driver,但用的是dsp及dma的实现,但在打开Android指定的音频文件 /dev/eac 时有误,所以音频这一块只是能编译通过,不能正常运行,正在考虑用ALSA (Advanced Linux Sound Architecture) 替代;
关于OSS大家可以参看IBM的文章: OSS--跨平台的音频接口简介,写得比较详细。
3.输入事件(键盘,鼠标)中的键盘事件不需要任何更改,就能正常处理,用的设备文件是 /dev/tty0,
但鼠标事件却不能正常处理,加上DEBUG_MOUSE发现用的是PS2的鼠标,但其实Android用的不是PS2的鼠标,用的应该是触摸屏(TouchScreen)鼠标,设备文件是 /dev/input/event0,详情请参见本人的blog: Android原生(Native)C开发之三:鼠标事件篇(捕鼠记),经过改动后,基本能实现鼠标的处理;
4.定时器用的是unix的实现;
5.多线程用的是pthread的实现,unix系统都是用pthread来实现多线程的,在 ln demo时别忘了加 -lpthread;
6.加载动态库用的是unix 的 dl库,同样,在ln demo时别忘了加 -ldl。
SDL提供了一个最小化的Makefile:Makefile.minimal,所有的实现都是 dummy,就是一个空的实现,编译能通过,但运行时什么都不能做,根据上面的分析,将 Makefile.minimal 的内容改成如下:
# Makefile to build the SDL library INCLUDE = -I./include
CFLAGS = -g -s -O2 $(INCLUDE)
CC = arm-none-linux-gnueabi-gcc
AR = arm-none-linux-gnueabi-ar
RANLIB = arm-none-linux-gnueabi-ranlib CONFIG_H = include/SDL_config.h
TARGET = libSDL.a
SOURCES =
src/*.c
src/audio/*.c
src/cdrom/*.c
src/cpuinfo/*.c
src/events/*.c
src/file/*.c
src/joystick/*.c
src/stdlib/*.c
src/thread/*.c
src/timer/*.c
src/video/*.c
src/audio/dsp/*.c
src/audio/dma/*.c
src/video/fbcon/*.c
src/joystick/dummy/*.c
src/cdrom/dummy/*.c
src/thread/pthread/*.c
src/timer/unix/*.c
src/loadso/dlopen/*.c OBJECTS = $(shell echo $(SOURCES) | sed -e 's,.c,.o,g') all: $(TARGET) $(TARGET): $(CONFIG_H) $(OBJECTS)
$(AR) crv $@ $^
$(RANLIB) $@ $(CONFIG_H):
cp $(CONFIG_H).default $(CONFIG_H) clean:
rm -f $(TARGET) $(OBJECTS) 最后将$SDLincludeSDL_config_minimal.h的内容改成如下: #ifndef _SDL_config_minimal_h
#define _SDL_config_minimal_h #include "SDL_platform.h" #include typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef unsigned int size_t;
//typedef unsigned long uintptr_t; #define HAVE_LIBC 1 #ifdef HAVE_LIBC
#define HAVE_ALLOCA_H 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_STDIO_H 1
#define STDC_HEADERS 1
#define HAVE_STDLIB_H 1
#define HAVE_STDARG_H 1
#define HAVE_MALLOC_H 1
#define HAVE_MEMORY_H 1
//#define HAVE_STRING_H 1
//#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_CTYPE_H 1
#define HAVE_MATH_H 1
//#define HAVE_ICONV_H 1
#define HAVE_SIGNAL_H 1
#define HAVE_ALTIVEC_H 1 #define HAVE_MALLOC 1
#define HAVE_CALLOC 1
#define HAVE_REALLOC 1
#define HAVE_FREE 1
#define HAVE_ALLOCA 1
#define HAVE_GETENV 1
#define HAVE_PUTENV 1
#define HAVE_UNSETENV 1
#define HAVE_QSORT 1
#define HAVE_ABS 1
//#define HAVE_BCOPY 1
//#define HAVE_MEMSET 1
//#define HAVE_MEMCPY 1
//#define HAVE_MEMMOVE 1
//#define HAVE_MEMCMP 1
//#define HAVE_STRLEN 1
//#define HAVE_STRLCPY 1
//#define HAVE_STRLCAT 1
//#define HAVE_STRDUP 1
#define HAVE__STRREV 1
#define HAVE__STRUPR 1
#define HAVE__STRLWR 1
//#define HAVE_INDEX 1
#define HAVE_RINDEX 1
//#define HAVE_STRCHR 1
#define HAVE_STRRCHR 1
#define HAVE_STRSTR 1
#define HAVE_ITOA 1
#define HAVE__LTOA 1
#define HAVE__UITOA 1
#define HAVE__ULTOA 1
#define HAVE_STRTOL 1
#define HAVE_STRTOUL 1
#define HAVE__I64TOA 1
#define HAVE__UI64TOA 1
#define HAVE_STRTOLL 1
#define HAVE_STRTOULL 1
#define HAVE_STRTOD 1
#define HAVE_ATOI 1
#define HAVE_ATOF 1
#define HAVE_STRCMP 1
#define HAVE_STRNCMP 1
#define HAVE__STRICMP 1
#define HAVE_STRCASECMP 1
#define HAVE__STRNICMP 1
#define HAVE_STRNCASECMP 1
#define HAVE_SSCANF 1
#define HAVE_SNPRINTF 1
#define HAVE_VSNPRINTF 1
//#define HAVE_ICONV
#define HAVE_SIGACTION 1
#define HAVE_SETJMP 1
#define HAVE_NANOSLEEP 1
//#define HAVE_CLOCK_GETTIME 1
#define HAVE_DLVSYM 1
#define HAVE_GETPAGESIZE 1
#define HAVE_MPROTECT 1
#else
#include
#endif //#define HAVE_STDIO_H 1
//#define HAVE_STDINT_H 1 //#define SDL_INPUT_TSLIB 1 //touch screen input #define SDL_AUDIO_DRIVER_OSS 1 // SDL_AUDIO_DRIVER_DUMMY #define SDL_CDROM_DISABLED 1 #define SDL_JOYSTICK_DISABLED 1 #define SDL_LOADSO_DLOPEN 1
//SDL_LOADSO_DISABLED 1 //#undef #define SDL_THREAD_PTHREAD 1 //SDL_THREADS_DISABLED //SDL_TIMERS_DISABLED
#define SDL_TIMER_UNIX 1 // SDL_VIDEO_DRIVER_DUMMY
#define SDL_VIDEO_DRIVER_FBCON 1 #endif
注意黑体部分,其实就是打开一些宏定义,将SDL的实现一一打开。
改完了这些以后,还需要改一些代码,主要是video方面的,因为Android Linux的framebuffer设备文件与标准Linux不同,Linux的fb设备文件一般是 /dev/fb0,但Android的设备文件是 /dev/graphics/fb0,打开 $SDL/src/video/fbcon/SDL_fbvideo.c,将191、499行的 "/dev/fb0" 替换成 "/dev/graphics/fb0",保存即可。
再修改 $SDL/src/thread/pthread/SDL_sysmutex.c,将第30行改成: #define FAKE_RECURSIVE_MUTEX 1,就是在后面加一个“1”子,这可能是编译器的一个bug,define默认应该就是“1”的。
现在可以开始编译libSDL.a了,在cygwin或Linux下,进入SDL目录,输入:
make -f Makefile.minimal
视情况面定,一般几分钟后能顺利编译 Android版的 SDL,编译成功后,就需要编译几个SDL的test demo来测试一下 SDL的性能。
进入 test目录,复制 Makefile.in 文件,并改名为 Makefile,将前面一点内容改为:
并将所有的 @MATHLIB@ 替换成 $(MATHLIB),保存后,先编译一个testsprite demo,在命令行输入:
make testsprite
编译成功后,启动Android模拟器,将编译出来的testsprite及icon.bmp上传至一个目录,如 /dev/sample,命令如下:
最后进入 android 的shell: adb shell,再进入 /dev/sample目录,执行testsprite demo即可:
可以根据模拟器的设置调整 width 及 height,因为程序默认的是 640x480的,初始化时会失败,如果一切正常的话,模拟器就会出现很多黄色的笑脸!按任意键退出,在本人机器上能达到 60 FPS左右,效果图如下:
其他的 demo有兴趣的朋友可以自己编译测试。
发表评论
-
转贴 有关js 函数验证和字符串查找替换的方法
2012-07-06 09:52 664/* ************************** ... -
正则表达式JS变量
2012-07-06 09:45 609str="苹果有大苹果小苹果之分"; ... -
java正则表达式学习
2012-07-06 09:37 656正则表达式的基础: 表达式 说明 \t 制表符. ... -
HL7 Message examples
2012-07-06 09:30 1092i am now in university(HIT@We ... -
mantis附件图片预览
2012-07-05 20:45 1193mantis在bug详情查看页面里,可以查看bug关联的附 ... -
UML建模图组件库,软件设计,UML绘制 ,打印,自动代码产生,软件,VC++,VB,控件源程序
2012-07-03 13:43 883UML建模图组件库,软件设计,UML绘制 ,打印,自动 ... -
在Flex Mobile中构建“本地”菜单
2012-07-02 12:15 735Adobe Flash Builder 4 简体中文正式版 ... -
探究 Flex 组件的生命周期
2012-07-02 12:15 610简介: 最为新一 ... -
在Eclipse下使用Ant编译Flex程序
2012-07-02 12:15 581我的机器内存1G,如果使用Eclipse Flex插件编译 ... -
flex与mysql交互
2012-07-02 12:14 666这个小例子通过remoteobject的通讯方法。实现fl ... -
实现FLEX 通过AMF跟PHP通信
2012-07-02 12:14 549AMF flex一种远调用 ... -
Flex引擎
2012-07-01 09:48 803游戏引擎 1、FFilmation 是一个2.5D游 ... -
Ant Flex project 应用
2012-07-01 09:48 701写一个Ant脚本,xml大 ... -
Flex 拖拽范例
2012-07-01 09:48 708Flex由于在其Framwork里加入了DragDrop管 ... -
myeclipse6.5+flex 3 + tomcat6.0 + ds-console.war环境搭建
2012-07-01 09:48 720安装环境:myeclipse6 ... -
探究 Flex 组件的生命周期
2012-07-01 09:48 497简介: 最为新一 ... -
[转载]【笔记本电脑报价】笔记本电脑
2012-06-30 16:11 718[转载]【笔记本电脑报 ... -
[转载]人力资源管理师(二级)复习笔记-第三章 培训与开发
2012-06-30 16:11 721[转载]人力资源管理师( ... -
[转载]《0岁潜能开发 开发无限能力的ESP教育法》笔记
2012-06-30 16:11 672[转载]《0岁潜能开发 开发无限能力的ESP教育法》笔记 ...
相关推荐
C语言案例1:SDL2游戏编程基础之环境准备-配套资源.zip
记录了SDL库成功移植到s3c6410开发板上,很详细,帮你完成移植工作
Android程序SDL2类库使用说明 简单记录一下Android程序使用SDL2类库的方法。这部分的信息可以参考SDL2源代码目录中的README-android.txt文件。SDL2使用的步骤可以分为以下步骤:
使用SDL2框架显示FPS的例子,VS2022编译通过。包含组件: SDL2、SDL2_image、SDL2_mixer、SDL2_ttf
linux下sdl库文件和头文件-------------------------------
我将带领大家一起来学习SDL2.0的编程知识,包括SDL2.0的编程框架、原理流程分析,几个核心对象、事件机制、扩展库的使用。 具体内容包括: 1.搭建开发环境:VS2015或Qt5.9,共两套环境。 2.核心对象编程:窗口、表面...
SDL2.2.0.1的移植,包含SDL的每个参数的意思,包含交叉编译器的安装,包含移植过程中出错的处理方法。 --prefix=/usr/arm 安装SDL路径 --enable-shared=yes 构建共享库[开启] --enable-nasm 装配blitters x86上的...
将SDL的库一直到arm上,在此期间出现很多问题,但是最后还是被我突破了,gendarme家分享一下,将他解压放到相应位置就可以使用
android下移植的sdl库,版本是1.3的
安全开发生命周期(SDL)是一个帮助开发人员构建更安全的软件和解决安全合规要求的同时降低开发成本的软件开发过程。安全应用从安全设计开始,软件的安全问题很大一部分是由于不安全的设计而引入的,微软用多年的...
SDL是Simple DirectMedia Layer 的缩写,是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、...
SDL移植实验,我的嵌入式实验报告。SDL移植教程。已成功!
SDL2粒子:SDL2的粒子系统
The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library designed to make it easy to write multi-media software, such as games and emulators.
运行在Android之上的Go-SDL2示例
Eclipse Android 例子源码 SDL Android 例子源码可用工程,实测编译通过在模拟器运行...此工程基于sdl 2.0 主要是.JNI工程,通过java,用c写图形在android上跑,相信sdl以后还对不会写java的人有很大参考价值和帮助.
软件开发电子书制作查壳软件
sdl开发的游戏,很有借鉴价值。sdl库是基于sdl1.2.14
SDL Android下编译源码, SDL2.03, Eclipse下NDK 编译运行
环境开源代码安装包:SDL-1.2.13.tar.gz SDL_image-1.2.6.tar.gz freetype-2.3.5.tar.gz SDL_ttf-2.0.8.tar.gz libiconv-1.12.tar.tar 编译安装安装包: tar –zxvf SDL-1.2.13.tar.gz ...