SDL(Simple DirectMedia Layer)是一套開(kāi)放源碼的跨平臺(tái)多媒體開(kāi)發(fā)庫(kù),使用C語(yǔ)言寫(xiě)成。SDL提供了多種圖像、聲音、鍵盤等的實(shí)現(xiàn),可配置性與移植性非常高,開(kāi)發(fā)者可以開(kāi)發(fā)出跨多個(gè)平臺(tái)(Linux、Windows、Mac OS X、Symbian、Widnows Mobiel等嵌入式系統(tǒng),當(dāng)然也包括今天要移植的平臺(tái):Android)的應(yīng)用,目前SDL多用于開(kāi)發(fā)游戲、模擬器、媒體播放器等多媒體應(yīng)用。
目前,SDL的穩(wěn)定版本是 1.2.13,1.3還在開(kāi)發(fā)中,可以通過(guò)SVN得到最新的代碼,本次移植以 1.2.13為準(zhǔn),沒(méi)有測(cè)試 1.3版的源碼。請(qǐng)從 SDL 的官方網(wǎng)站下載 1.2.13 的源碼,文件名為:SDL-1.2.13.zip,并解壓,將得到一個(gè) SDL-1.2.13 目錄。
在Native編譯SDL之前,要先裝 Code Sourcery公司的arm交叉編譯器,如果是用Windows操作系統(tǒng),則一定要裝 Cygwin(一個(gè)在windows上模擬linux的軟件),因?yàn)樵诰幾g時(shí)要用到一些 linux命令,具體的步驟請(qǐng)參見(jiàn):Port SDL/TinySDGL to android with native C,或自已在網(wǎng)上搜一些資料。
因?yàn)镾DL是用純C寫(xiě)的一套類庫(kù),所以移植性非常好,官方支持的系統(tǒng)有: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,而且網(wǎng)上也有人將SDL移植到很多其他嵌入式系統(tǒng),甚至有人將SDL移植到 Moto A1200,如此強(qiáng)大的可移植性,其架構(gòu)真是值得好好學(xué)習(xí)。
現(xiàn)在切入正題,如何為Android量身定做一個(gè) SDL,下面就從視頻,音頻,輸入事件,定時(shí)器(video,audio,events[key,mouse],timer),多線程等幾個(gè)方面來(lái)分析:
1.首先講視頻方面,Android是一個(gè)定制的Linux操作系統(tǒng),Linux顯示要么用 X11,要么用framebuffer技術(shù),很顯然Android并沒(méi)有集成 X11(也許Android的軟件界面是基于X11的?!),那只有唯一的選擇:framebuffer!
打開(kāi)$SDL/src/video目錄,可以發(fā)現(xiàn)SDL支持多達(dá)30多種的視頻顯示技術(shù),其中包括我們想要的fbcon及directfb,directfb我沒(méi)有做測(cè)試,也許顯示效果會(huì)比linux自帶的fbcon好,有興趣的朋友可以試一下,成功了別忘了告訴我;
2.再來(lái)談音頻,記得一個(gè)廣告詞:沒(méi)有聲音,再好的戲也出不來(lái)!可見(jiàn)音頻對(duì)多媒體應(yīng)用的重要性。
這次用的是OSS的driver,但用的是dsp及dma的實(shí)現(xiàn),但在打開(kāi)Android指定的音頻文件 /dev/eac 時(shí)有誤,所以音頻這一塊只是能編譯通過(guò),不能正常運(yùn)行,正在考慮用ALSA (Advanced Linux Sound Architecture) 替代;
關(guān)于OSS大家可以參看IBM的文章: OSS--跨平臺(tái)的音頻接口簡(jiǎn)介,寫(xiě)得比較詳細(xì)。
3.輸入事件(鍵盤,鼠標(biāo))中的鍵盤事件不需要任何更改,就能正常處理,用的設(shè)備文件是 /dev/tty0,
但鼠標(biāo)事件卻不能正常處理,加上DEBUG_MOUSE發(fā)現(xiàn)用的是PS2的鼠標(biāo),但其實(shí)Android用的不是PS2的鼠標(biāo),用的應(yīng)該是觸摸屏(TouchScreen)鼠標(biāo),設(shè)備文件是 /dev/input/event0,詳情請(qǐng)參見(jiàn)本人的blog: Android原生(Native)C開(kāi)發(fā)之三:鼠標(biāo)事件篇(捕鼠記),經(jīng)過(guò)改動(dòng)后,基本能實(shí)現(xiàn)鼠標(biāo)的處理;
4.定時(shí)器用的是unix的實(shí)現(xiàn);
5.多線程用的是pthread的實(shí)現(xiàn),unix系統(tǒng)都是用pthread來(lái)實(shí)現(xiàn)多線程的,在 ln demo時(shí)別忘了加 -lpthread;
6.加載動(dòng)態(tài)庫(kù)用的是unix 的 dl庫(kù),同樣,在ln demo時(shí)別忘了加 -ldl。
SDL提供了一個(gè)最小化的Makefile:Makefile.minimal,所有的實(shí)現(xiàn)都是 dummy,就是一個(gè)空的實(shí)現(xiàn),編譯能通過(guò),但運(yùn)行時(shí)什么都不能做,根據(jù)上面的分析,將 Makefile.minimal 的內(nèi)容改成如下:
# Makefile to build the SDL library INCLUDE = -I./include CONFIG_H = include/SDL_config.h OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') all: $(TARGET) $(TARGET): $(CONFIG_H) $(OBJECTS) $(CONFIG_H): clean: |
最后將$SDL\include\SDL_config_minimal.h的內(nèi)容改成如下:
#ifndef _SDL_config_minimal_h #include "SDL_platform.h"
#include <stdarg.h> typedef signed char int8_t; #define HAVE_LIBC 1 #ifdef HAVE_LIBC
//#define SDL_INPUT_TSLIB 1 //touch screen input
//SDL_TIMERS_DISABLED // SDL_VIDEO_DRIVER_DUMMY #endif |
注意黑體部分,其實(shí)就是打開(kāi)一些宏定義,將SDL的實(shí)現(xiàn)一一打開(kāi)。
改完了這些以后,還需要改一些代碼,主要是video方面的,因?yàn)锳ndroid Linux的framebuffer設(shè)備文件與標(biāo)準(zhǔn)Linux不同,Linux的fb設(shè)備文件一般是 /dev/fb0,但Android的設(shè)備文件是 /dev/graphics/fb0,打開(kāi) $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,就是在后面加一個(gè)“1”子,這可能是編譯器的一個(gè)bug,define默認(rèn)應(yīng)該就是“1”的。
現(xiàn)在可以開(kāi)始編譯libSDL.a了,在cygwin或Linux下,進(jìn)入SDL目錄,輸入:
make -f Makefile.minimal
視情況面定,一般幾分鐘后能順利編譯 Android版的 SDL,編譯成功后,就需要編譯幾個(gè)SDL的test demo來(lái)測(cè)試一下 SDL的性能。
進(jìn)入 test目錄,復(fù)制 Makefile.in 文件,并改名為 Makefile,將前面一點(diǎn)內(nèi)容改為:
# Makefile to build the SDL tests srcdir = .
|
并將所有的 @MATHLIB@ 替換成 $(MATHLIB),保存后,先編譯一個(gè)testsprite demo,在命令行輸入:
make testsprite
編譯成功后,啟動(dòng)Android模擬器,將編譯出來(lái)的testsprite及icon.bmp上傳至一個(gè)目錄,如 /dev/sample,命令如下:
adb push testspirte /dev/sample/testsprite adb push icon.bmp /dev/sample/icon.bmp |
最后進(jìn)入 android 的shell: adb shell,再進(jìn)入 /dev/sample目錄,執(zhí)行testsprite demo即可:
#cd /dev/sample #chmod 755 testsprite #./testsprite -width 320 -height 480 -bpp 32 |
可以根據(jù)模擬器的設(shè)置調(diào)整 width 及 height,因?yàn)槌绦蚰J(rèn)的是 640x480的,初始化時(shí)會(huì)失敗,如果一切正常的話,模擬器就會(huì)出現(xiàn)很多黃色的笑臉!按任意鍵退出,在本人機(jī)器上能達(dá)到 60 FPS左右,效果圖如下:
其他的 demo有興趣的朋友可以自己編譯測(cè)試。
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |