將 SDL整合至Android平台

转载 2011年01月10日 10:11:00

網 路上有很多文章在講解如何將SDL整合到Android的平台上,我自己也試著動手做看看,順便將一些步驟及心得整理起來。

以下是這次我所用到的開發環境。

- Cygwin
- Android NDK:android-ndk-r4b-windows
- SDL
:1.2.14


《Step 1》
將SDL中的Makefile.minimal修改如下 (紅體字) :

# Makefile to build the SDL library

PREBUILT = /android-ndk-r4b/build/prebuilt/windows/arm-eabi-4.4.0

INCLUDE = -I./include -I/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/include
CFLAGS  = -g -O2 $(INCLUDE)
CC  = $(PREBUILT)/bin/arm-eabi-gcc
AR  = $(PREBUILT)/bin/arm-eabi-ar
RANLIB  = $(PREBUILT)/bin/arm-eabi-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/generic/*.c /
    src/timer/unix/*.c /
    src/loadso/dummy/*.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)



《Step 2》
修改 ./include/SDL_config_minimal.h (紅體字) :

#ifndef _SDL_config_minimal_h
#define _SDL_config_minimal_h

#include "SDL_platform.h"

/* This is the minimal configuration that can be used to build SDL */

#include <stdarg.h>

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 SDL_AUDIO_DRIVER_OSS    1

#define SDL_CDROM_DISABLED  1

#define SDL_JOYSTICK_DISABLED   1

#define SDL_LOADSO_DISABLED 1

#define SDL_THREADS_DISABLED    1

#define SDL_TIMER_UNIX  1

#define SDL_VIDEO_DRIVER_FBCON  1

#define HAVE_STDIO_H 1

#endif /* _SDL_config_minimal_h */



《Step 3》
由於Android的framebuffer設 備是 /dev/graphics/fb0 (Linux是 /dev/fb0),所以我們需要修改 ./src/video/fbcon/SDL_fbvideo.c。將檔案中所有的/dev/fb0全都置換成/dev/graphics/fb0


《Step 4》
開始編譯 libSDL.a,在 Cygwin下進入SDL的根目錄,輸入

make -f Makefile.minimal


《Step 4.1》

make 的過程中會遇到一些compile error,我們一步步來解決它們。首先,compiler會告訴我們某些變數已經 (在SDL_config_minimal.h) 重覆定義了:

/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/include/stdint.h:53: error: redefinition of typedef 'int8_t'
./include/SDL_config_minimal.h:32: note: previous declaration of 'int8_t' was here


解決 的辦法是將SDL_config_minimal.h中重覆定義的部分mark起來 (紅體字):

//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;


《Step 4.2》
接 著,compiler認為SDL_dummy_enum的size不合法:

./include/SDL_stdinc.h:151: error: size of array 'SDL_dummy_enum' is negative

在 這邊,我將SDL_stdinc.h的151行mark起來 (紅體字):

//SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));

《Step 4.3》
最後會遇到的error是找不到soundcard.h:

src/audio/dsp/SDL_dspaudio.c:44:27: error: sys/soundcard.h: No such file or directory

因 為sys/soundcard.h指的是/cygwin/usr/include下的header檔,所以我們要回到Makefile.minimal中 的INCLUDE,將該路徑告訴compiler (紅體字):

INCLUDE = -I./include -I/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/include -I/usr/include

修 改完之後再重新make。



《Step 5》
成功,在SDL的 根目錄下產生libSDL.a

fbcon总结

图形显示的driver 一般分为两类,一类是drm,一类是fbcon。 如果是drm的话,一般是console ---> VGA driver ---> hardware. 如果是fbcon的话,...
  • tiantao2012
  • tiantao2012
  • 2017年05月09日 09:49
  • 776

Port SDL/TinySDGL to android with native C

I have success port SDL/TinySDGL to android with native C!Make SDL with Makefile.minimal makefile, a...
  • vrix
  • vrix
  • 2009年02月17日 20:41
  • 1104

如何成功运行SDL官方提供的Android平台的Demo

如何成功运行SDL官方提供的Android平台的Demo 作者:雨水  日期:2014-4-30 编写说明:SDL的官方提供了一个Anroid的demo模板SDLActivity,无法直接运行...
  • gobitan
  • gobitan
  • 2014年04月30日 10:06
  • 12802

Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)

SDL(Simple Directmedia Layer)是一套开源的跨平台多媒体开发库,集成了音视频的许多底层的API,介绍Windows平台下的例子已经很多了,例如:雷老师的 最简单的视音频播放示...
  • danjuan123
  • danjuan123
  • 2017年03月23日 15:19
  • 2188

利用ffmpeg和SDL实现一个跨android版本的音视频播放器

1:从http://www.libsdl.org/tmp/下载SDL for android 版本(我下载的是 SDL-1.3.tar.gz )  2:从https://github.com/hav...
  • vbLittleBoy
  • vbLittleBoy
  • 2014年03月24日 18:44
  • 2931

搭建SDL 的Android 开发环境,的详细步骤(建立sdl2.0 for Android开发环境)

搭建SDL 的Android 开发环境,的详细步骤(建立sdl2.0 for Android开发环境),亲测通过,详细步骤 1.安装下载jdk,进入该网页: http://java.sun.com...
  • mynameislinduan
  • mynameislinduan
  • 2014年01月07日 18:08
  • 4488

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

本文记录一个安卓平台下SDL的例子。该例子读取并显示了一张BMP图片,通过该例子可以了解SDL在安卓平台下的使用。本文中使用的SDL版本为2.0。Android程序SDL2类库使用说明简单记录一下An...
  • leixiaohua1020
  • leixiaohua1020
  • 2015年07月25日 23:02
  • 16134

如何在Android用FFmpeg+SDL2.0之同步音频

同步音频的原理可以参考:http://dranger.com/ffmpeg/tutorial05.html  本文是在 如何在Android用FFmpeg+SDL2.0之同步视频 的基础上面继续进...
  • tanlon_0308
  • tanlon_0308
  • 2014年10月24日 15:25
  • 1744

零基础学习SDL开发之移植SDL2.0到Android

在[原]SDL开发教程我们知道了如何在pc下使用SDL进行开发,在android上面是否一样可以使用呢?答案是肯定的。...
  • tanlon_0308
  • tanlon_0308
  • 2014年10月24日 11:00
  • 1414

SDL 系统框架

SDL体积小,便携,可靠。 唯一的缺点是,文档,极度的缺乏学习文档。 学习SDL可以到下面几个地址获取资料: SDL官网:http://www.libsdl.org github:https:/...
  • kiazhu
  • kiazhu
  • 2017年01月26日 15:21
  • 368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:將 SDL整合至Android平台
举报原因:
原因补充:

(最多只允许输入30个字)