SDL移植

SDL移植

注: 此贴转自我们以前的Google协作平台!


  • SDL简介

SDL是一个自由的跨平台的多媒体开发包,适用于 游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件。是为数不多的商业游戏开发公司使用的免费软件库之一。它提供跨平台的二维帧缓冲区图形和音频服务,它支持 Linux、Win32 和 BeOS。也不同程度地支持其它平台,包括 Solaris、IRIX、FreeBSD 和 MacOS。除了大量的服务,包括线程、独立于字节存储次序的宏和 CD 音频,SDL
 还提供了一个简单的 API,它允许您尽可能接近本机硬件。使用 SDL 有三重优点:稳定、简单和灵活。
  • 稳定 。如果 SDL 不向 API 提供可靠的支持,那么那些爱好者和商业公司就不能使用它。因为使用了 SDL,就添加了错误修正并增强了性能,也就加强了 API 的强健性。就像内核开发是分步进行的,SDL 的开发也是分步进行的,其中一部分是可靠稳定的 API,其它部分是新功能和构思的沙箱。
  • 简单 。SDL 被设计成一个简单的 API,以最少的代码实现您的构思。
  • 灵活 。返回到上面的 Optimum 演示代码示例,只要移植到 SDL,并确定一些数据假设,那么根本不必改动代码,演示就可以在 Win32、BeOS 和 Linux 控制台上运行了。灵活性的另一方面体现在尽管代码完全是跨平台的,但不会把您和底层实现隔开。SDL 提供了函数 SDL_GetWMInfo(),该函数可以让您访问底层驱动程序的专用窗口信息。

  • 在PC机上安装SDL开发环境
和Linux下其他的软件库一样,SDL同样具有很强的移植性!我们所要做的就是在PC机上编写应用程序,调试通了以后就可以交叉编译移植到ARM板子上。到http://www.libsdl.org/download-1.2.php 下载SDL-1.2.13 (stable),然后进行安装,由于后面的交叉编译的是`tar.xx`
源码包,所以建议在PC机上使用`tar.xx`包进行安装。

安装前请先查看是否安装有SDL,如果有请先卸载,如果你的系统使用的是`rpm软件安装包管理器`可以使用下面的命令进行查看:
# rpm -qa |grep SDL
如果使用`dpkg软件包管理器`,可以使用:
# dpkg -s SDL

下一步开始安装,这里以
SDL-1.2.13.tar.gz 为例:
# cd /tmp
# wget http://www.libsdl.org/release/SDL-1.2.13.tar.gz
# tar zxf SDL-1.2.13.tar.gz
# cd SDL-1.2.13
# ./configure --help

使用上面这条命令用来查看`configure`选项信息,然后在这些选项中筛选必要的选项。
# ./configure --prefix=/usr/local/SDL  --disable-video-x11  2>&1 | tee conf_log
`--prefix=/usr/local/SDL`是SDL的安装目录,此目录可以自己设定。
由于我的系统没有x11的开发环境,并且也不会用到SDL操作x11,因此我使用了`--disable-video-x11`这个选项。
参数`2>&1 | tee conf_log`的意思是把configure的信息输出到终端的同时写入到`conf_log`中,这个参数很有用,我们可以不用一直
盯着屏幕看是否报错,等编译完成后直接查看`conf_log`这个文件即可,以后在`configure`、`make`等操作时,建议使用这个参数。
如果没有错误,执行:
# make 2>&1 | tee make_log
# make install

OK.PC 机上SDL安装完成。下面编译SDL的例子程序做测试:
# cd test
# ./configure --with-sdl-prefix=/usr/local/SDL
# make
# ./testwin

如果在屏幕上出现一张图片闪过说明SDL编译成功。


  • 交叉编译SDL库
由于ARM板的资源有限,不可能把所有的选项都开启,因此我们需要根据实际情况进行选择,下面的选项一般可以满足我们的要求:
# ./configure --prefix=/work/SDL_arm CC=arm-linux-gcc  --host=arm-linux --target=linux --disable-debug --disable-cdrom --disable-esd --disable-arts  --disable-arts-shared --disable-diskaudio --disable-nas --disable-esd-shared --disable-mintaudio --disable-nasm --disable-video-x11 --disable-video-dga  --disable-dga --disable-video-ps2gs --disable-video-xbios --disable-video-gem --disable-video-opengl --disable-directx --disable-stdio-redirect --disable-osmesa-shared 2>&1 | tee conf_log
如果没有报错就可以进行编译:
# make 2>&1 | tee make_log
如果报错的话就需要根据出错信息调整一下`configure`的选项参数后编译(参数调整后没有必要`make clean`,直接`make` 就行了,make工具会智能的探寻哪些目标需要编译)。如果没有错误就可以`make install`了。
# make install

下一步测试交叉编译的SDL库是否能在ARM上正常使用。
交叉编译SDL的例子程序
# cd test
# ./configure CC=arm-linux-gcc --host=arm-linux --with-sdl-prefix=/work/SDL_arm
# make

如果报错的话,根据错误提示进行修改。

把交叉编译的库通过
nfs服务器 共享到ARM板。
# cp /work/SDL_arm/lib/libSDL-1.2.so.0.11.2 $NFS_ROOTDIR
# cp ./testwim $NFS_ROOTDIR


做SDL库文件的软链接(SDL动态库使用libSDL-1.2.so.0这个名字提供服务)。
# cd $NFS_ROOTDIR
# ln -s libSDL-1.2.so.0.11.2 libSDL-1.2.so.0


执行下列操作:
  • 启动nfs服务器
  • 启动ARM
  • 通过minicom 登录ARM
  • 挂载nfs共享文件夹
  • 运行例子程序`testwin`
如果运行成功就说明移植成功,失败的话不用心慌,认真的参考出错信息查找出错原因。

  • 编写SDL程序
SDL2.2.0.1移植,包含SDL的每个参数的意思,包含交叉编译器的安装,包含移植过程中出错的处理方法。 --prefix=/usr/arm 安装SDL路径 --enable-shared=yes 构建共享库[开启] --enable-nasm 装配blitters x86上的nasm(汇编器) --enable-oss 启用支持oss声音的API --enable-alsa 启用支持ALSA声音的API --enable-alsa-shared 启用动态加载ALSA声卡的API --enable-pulseaudio 启用pulseaudio(脉冲音频) --enable-pulse-shared 启用动态加载脉冲音频支持 --enable-arts 启用支持Analog Read Time Synthesizer(模拟实时合成器) --enable-arts-shared 启用动态加载ARTS声卡的支持 --enable-joystick 启用joystick(控制杆)系统 --enable-cdrom 启用只读光盘系统[关闭] --enable-threads 启用多线程子系统 --enable-timers 启用计时器子系统 --enable-endian 大小端设置 --enable-file 启用文件系统 --enable-esd 支持Enlightened(文明)声音后台程序 --enable-nas 支持NAS(网络连接存储)声卡API --enable-diskaudio 支持磁盘写入声卡驱动 --enable-dummyaudio 支持虚拟声卡驱动 --enable-altivec 使用altivec装配位块传送器在PPC上 --enable-video-x11 使用x11视频驱动 --enable-dga 允许使用x1 DGA代码 --enable-video-x11-vm 使用x11 vm延长全屏 --enable-video-x11-dgamouse 使用x11 DGA鼠标事件 --enable-video-x11-xv 使用x11 xv音像延长视频 --enable-video-x11-xinerama 启动x11多银幕支持 --enable-video-dga 使用DGA2.0视频驱动 --enable-video-directfb 启用DirectFB视频驱动 --enable-video-photon 使用QNX(嵌入式实时系统)光子视频驱动 --enable-video-ps2gs 使用PS(游戏机)2 GS视频驱动 --enable-video-opengl 包括OpenGL(开放图形语言)创建上下文 --enable-video-pth 使用GNU pth库对多线程 --enable-pthreads 使用POSIX线程(可移植操作系统)对多线程 --enable-pthread-sem 使用多线程信号 --enable-input-events 使用Linux-2.4统一输入接口 --enable-input-tslib 使用Touchscreen库输入
SDL(Simple DirectMedia Layer)库移植到 Android 平台需要结合 Android NDK 开发环境进行配置和编译,以下是详细的步骤说明: ### 准备工作 在开始之前,确保已经安装 Android Studio,并且配置了 NDK 和 CMake。SDL 官方提供了 Android 移植的模板工程,通常可以在 SDL2 源码包中的 `android-project` 文件夹中找到。 ### 创建 Android 工程 1. 新建一个 Android 工程(例如 `AndroidSDL`),并在其 `app` 模块下准备 JNI 和 Java 层的代码。 2. 将 `android-project` 工程中 `app/src` 和 `jni` 目录下的内容复制到新建工程的对应位置,确保目录结构一致 [^2]。 ### 配置 JNI 环境 1. 在 `app/jni/` 目录下放置 SDL2 的源码。 2. 修改 `Android.mk` 文件,确保 `LOCAL_SHARED_LIBRARIES` 中包含 SDL2 的依赖库,例如 `SDL2_image` 等 [^3]。 3. 配置 `Application.mk` 文件,设置目标 ABI(如 `armeabi-v7a`, `arm64-v8a`, `x86_64` 等)和编译器参数。 ### 修改 Java 层代码 1. 将 `SDLActivity.java` 文件复制到 `app/src/main/java/org/libsdl/app/` 路径下。 2. 根据实际需求修改 `SDLActivity.java` 中加载的 Native 库名称,例如将 `libmain.so` 改为 `libffplay.so`,并调整 `native` 方法的调用函数名 [^4]。 ### 编写 Native 代码 1. 在 `app/jni/src/` 路径下编写或移植 SDL 程序的主逻辑。 2. 如果需要与 SDL 的 `main` 函数兼容,可以将入口函数重命名为 `SDL_main`,或者在 Java 层指定新的入口函数名称。 3. 确保链接 SDL2 的共享库,使用 `-lSDL2` 等参数进行链接。 ### 构建和运行 1. 使用命令行或 Android Studio 构建项目,生成 `.so` 文件。 2. 部署应用到 Android 设备或模拟器上进行测试。 ### 示例代码:JNI 调用 SDL 以下是一个简单的 JNI 入口示例,用于启动 SDL 主循环: ```c #include "SDL.h" extern "C" JNIEXPORT void JNICALL Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject array) { // 初始化 SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { // 错误处理 return; } // 创建窗口 SDL_Window* window = SDL_CreateWindow("SDL on Android", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL); if (!window) { SDL_Quit(); return; } // 主循环 SDL_Event event; while (1) { while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { goto exit; } } } exit: SDL_DestroyWindow(window); SDL_Quit(); } ``` ### 示例代码:修改后的 `Android.mk` ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main LOCAL_C_INCLUDES := $(LOCAL_PATH)/../SDL2/include \ $(LOCAL_PATH)/../SDL2_image LOCAL_SHARED_LIBRARIES := SDL2 SDL2_image LOCAL_SRC_FILES := main.c include $(BUILD_SHARED_LIBRARY) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值