Android EmulatorでSDLを実行してみる
本文最後に記載したサイトを参考に、SDLをリンクしたAndroidネイティブバイナリを作成してみた。
ビルド及び実行環境は前回エントリと同様。Portable UbuntuでSDLライブラリをビルドし、このライブラリをリンクした実行バイナリを作成する。その後、Windows上で動かしているEmulatorで実行する。
準備
新たにインストールしたものは以下の通り。
SDLビルド
SDL-1.2.13/src/video/fbcon/SDL_fbvideo.c を開き、191行目, 及び499行目にある、"/dev/fb0"を"/dev/graphics/fb0"に書き換える。
その後、SDL-1.2.13ディレクトリで以下のコマンドを実行する。(追記:以下をそのままコピー&ペーストすると、行末に半角スペースが含まれてしまいうまく実行できないようだ。オリジナルをコピーした方が良いだろう。)
./configure \
CC=arm-none-linux-gnueabi-gcc \
--host=arm-linux \
--enable-audio=no \
--enable-video=yes \
--enable-cdrom=no \
--enable-joystick=no \
--enable-threads=no \
--enable-timers=no \
--enable-loadso=no \
--enable-video-fbcon=yes \
--enable-shared=no \
--enable-sdl-dlopen=no \
--enable-video-x11=no \
--enable-x11-shared=no \
--enable-dga=no \
--enable-video-dga=no \
--enable-video-x11-dgamouse=no \
--enable-video-x11-vm=no \
--enable-video-x11-xv=no \
--enable-video-x11-xinerama=no \
--enable-video-x11-xme=no \
--enable-video-x11-xrandr=no \
--enable-video-x11-dpms=no \
--enable-video-photon=no \
--enable-video-carbon=no \
--enable-video-cocoa=no \
--enable-video-fbcon=yes \
--enable-video-directfb=no \
--enable-video-ps2gs=no \
--enable-video-ggi=no \
--enable-video-svga=no \
--enable-video-vgl=no \
--enable-video-wscons=no \
--enable-video-aalib=no \
--enable-video-qtopia=no \
--enable-video-picogui=no \
--enable-video-xbios=no \
--enable-video-gem=no \
--enable-video-dummy=no \
--enable-video-opengl=no \
SDL-1.2.13/build/.libs ディレクトリに libSDL.a が作成される。
実行ファイル作成
以下の内容を持つsdlsample.cを作成する。
#include "SDL.h" int main(int argc, char * argv[]) { SDL_Surface * scr; SDL_Rect rect; int i, j; static int k; Uint8 r, g, b; /* Init SDL: */ printf("about to init\n"); printf("test point %d\n", 1); if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Can't init: %s\n", SDL_GetError()); exit(1); } printf("test point %d\n", 2); /* Open screen: */ scr = SDL_SetVideoMode(320, 480, 16, SDL_HWSURFACE); printf("test point %d\n", 3); for (i = 0; i < 16; i++) { /* Determine where to draw rect: */ rect.x = i * 10; rect.y = i * 7; rect.w = 100; rect.h = 50; /* What color should it be? */ r = (i * 4); g = ((64 - i) * 4); b = (i % 4) * 64; /* Draw a rectangle on the screen: */ SDL_FillRect(scr, &rect, SDL_MapRGB(scr->format, r, g, b)); SDL_UpdateRect(scr, rect.x, rect.y, rect.w, rect.h); /* Wait five seconds: */ // SDL_Delay(1000); for (j = 0; j < 100000; j++) { k = j; } } printf("about to quit\n"); /* Quit: */ SDL_Quit(); return (0); }
これをコンパイルする。
$ arm-none-linux-gnueabi-gcc sdlsample.c -o sdlsample -static -ISDL-1.2.13/include -LSDL-1.2.13/build/.libs –lSDL
この後の実行までの流れは前回と同様。
補足
上記を実行してみるとわかるが、画面描画は行われているが、タイミングがかなり速くなっており即座に終了する。ソースコード中のコメント Wait five seconds 以下に問題がありそうだ。
上記の例ではSDLのビルドオプションで--enable-timers=noを指定しているが、有効にしても問題ないようなので、このオプションを削除しSDLを再ビルドする。
この上で、ソースコード中のコメントアウト行SDL_Delay(1000);を復活させ、その後ろのforループを削除したものを実行すると、想定通り(と思われる)結果が得られる。
その他のビルドオプションも再検討の余地がありそうに感じる。
参考
« Portable Ubuntu RemixでAndroidバイナリを作成する | トップページ | Holux M-241 ファームウェアがVer1.13になっていた »
この記事へのコメントは終了しました。
« Portable Ubuntu RemixでAndroidバイナリを作成する | トップページ | Holux M-241 ファームウェアがVer1.13になっていた »
コメント