【IT168 技术文档】本文通过描述一次完整的移植VBA项目(VisualBoyAdvanced,一款高性能的GBA游戏机模拟器)项目进入OPhone系统,进而了解OPhone的图形系统的工作原理,希望为在做项目移植开发的读者提供相关方面有益的启发。
VisualBoyAdvance被公认为最好的GBA模拟器,其性能优异,工作稳定,支持GB,GBC,GBA全系列游戏机模拟,该软件具备了跨平台能力,可以在windows和linux系统中运行,放置在sf.net中,其项目是完全开源,代码全部使用C++和汇编语言实现。
项目地址:http://sourceforge.net/projects/vba/,
最新版本号为1.7.2,源码包解压尺寸为7.6兆。
可行性分析
要做移植,首先要从原始项目的目录结构入手:
移植步骤:
1,将VisualBoyAdvance目录放入packages/apps目录下,创建android.mk文件,创建工程编译配置项:
LOCAL_MODULE := libvba
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE_TAGS := tests
LOCAL_SHARED_LIBRARIES := libc libm libui libpng libz
2,将目录中的C++源码文件列表放入android.mk文件列表中,在VisualBoyAdvance目录下使用如下命令,
{print "common_SRC_FILES:= \\"} {print $0 " \\"}'
common_SRC_FILES:= \
./src/gb/gbGlobals.cpp \
./src/gb/gbPrinter.cpp \
… #省略很多文件列表
./src/bilinear.cpp #结尾处连接符手工删除
3,手工将./src/sdl/SDL.cpp里面所有涉及sdl api调用的函数全部注空,待填入新的窗口系统处理代码。
4,试着在该目录下键入mm命令编译,正常情况下,能够一次编译通过,如有问题,应将编译错误解决。
5,SDL模块的替换思路如下:输入事件用jni接口方式,从java层获取的键盘事件传入,游戏输出的画面帧则通过直接写入java层申请得到Surface对应的native对象,并及时刷新来实现。
6,用eclipse创建java层代码,主要是创建全屏的窗口,窗口类型为SurfaceView,并将Surface对象通过jni接口传入 libvba中,同理将窗口获取的事件传入libvba中,将启动应用的参数(rom文件路径以及其它配置项)传入libvba中,最终由libvba来实现对rom的模拟执行,将用户的输入转为每一帧的游戏画面,并呈现在手机屏幕上。
平台移植心得
最大的收获就是通过这次移植,对窗口系统有了比较清晰的认识,在java层的用户输入可以传入本地代码,图形输出系统在平台内部核心代码则都是通过本地代码来实现的,可以用本地代码直接访问。(作者:罗治凡)