移植VBA项目到OMS系统
本文通过描述一次完整的移植 VBA 项目( VisualBoyAdvanced ,一款高性能的 GBA 游戏机模拟器)项目进入 OMS 系统,进而了解 OMS 的图形系统的工作原理,希望为在做项目移植开发的读者提供相关方面有益的启发。
VisualBoyAdvance 被公认为最好的 GBA 模拟器,其性能优异,工作稳定,支持 GB,GBC,GBA 全系列游戏机模拟,该软件具备了跨平台能力,可以在 windows 和 linux 系统中运行,放置在 sf.net 中,其项目是完全开源,代码全部使用 C++ 和汇编语言实现,
项目地址: http://sourceforge.net/projects/vba/ ,
最新版本号为 1.7.2 ,源码包解压尺寸为 7.6 兆。
- 可行性分析
要做移植,首先要从原始项目的目录结构入手:
├─ m4 automake 配置文件
├─ po 不同语种的字符串配置
├─ src
│ ├─ gb GBA 模拟器核心引擎
│ ├─ gtk 封装 GTK 库
│ │ └─ images 界面资源
│ ├─ i386 针对 i386CPU 做的光栅处理优化代码
│ ├─ prof 调整模拟性能代码
│ ├─ sdl 封装跨平台二维图形库
│ └─ win32 windows 下窗口实现
└─ win32 windows 下缺失的相关库的实现代码
├─ include
│ ├─ cximage
│ ├─ png
│ └─ zlib
├─ lib
│ └─ win32
└─ SDL-1.2.2
├─ include
└─ lib
通过目录的分析,得知界面窗口系统的实现分别放置在不同的目录 (gtk,sdl,windows) 下,而 OMS 系统( android )底层是基于 linux 实现的,但系统剔除了 gtk 界面库,所以选择 sdl 实现是比较好的策略,之后再重新对 sdl 内部的函数逐一替换,即可完成窗口系统的移植,同时系统配套的 CPU 选用的是 arm9 系列,所以 i386 下的针对 cpu 的优化代码也应抛弃,总结如下 : 需要添加 android 编译系统规范的 android.mk 文件,配置中应将 win32,src/win32,src/i386,src/gtk 这几个目录忽略, 调用 sdl 函数的代码也应该全部去掉,并移入 OMS 自己的 GUI 接入的代码,,由上述几步之后最终剩下的都是 C++ 代码,采用 OMS 平台的交叉版本的 gcc 进行编译,同时为方便 OMS 系统的管理,应该将以上 native 代码编译成 jni 动态库,供上层的 java 界面应用使用,即可完成移植。
- 移植步骤:
1 ,将 VisualBoyAdvance 目录放入 packages/apps 目录下,创建 android.mk 文件,
创建工程编译配置项:
include $(CLEAR_VARS)
LOCAL_MODULE := libvba
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE_TAGS := tests
LOCAL_SHARED_LIBRARIES := libc libm libui libpng libz
2 ,将目录中的 C++ 源码文件列表放入 android.mk 文件列表中,在 VisualBoyAdvance 目录下使用如下命令,
find -name *.cpp | grep -v win32 | grep -v gtk | awk 'BEGIN{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 层的用户输入可以传入本地代码,图形输出系统在平台内部核心代码则都是通过本地代码来实现的,可以用本地代码直接访问 .
移植VBA项目到OMS系统相关推荐
- 分享OMS系统实战的三两事
OMS系统实战 1. 前言 2. 架构设计 2.1 业务架构 2.2 系统架构 3. 功能演进 3.1 单据业务演进 3.2 库存管理演进 4. 一般功能设计 4.1 关联数据映射 4.2 状态数据隔 ...
- Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)
源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统主要实现的功能有: 网上商城系统,前台+后台管理,用户注册,登录,上架展示,分组展示,搜索,收货地址管理,购物车管理,添 ...
- Java项目:在线考试系统(java+springboot+vue+jsp+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统主要实现的功能有: 学生以及老师的注册登录,在线考试,错题查询,学生管理,问题管理,错题管理,错题查询,分数查询,试卷管 ...
- 项目集成自动分词系统ansj,实现自定义词库
一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...
- C小项目 —— 学生选课系统
C小项目 -- 学生选课系统 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include&l ...
- linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...
背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...
- 下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》
基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1c3zLGZ2 密码:e7 ...
- 使软件可二次开发_九思软件:平台型OA系统为何要好于项目型OA系统?
现代企业往往会把企业战略落实在项目中,所以在OA系统选型中很多企业过于侧重项目管理,选择项目型OA办公系统.然而,随着信息化的发展,传统的OA产品已无法满足于企业不断拓展的个性化需求,针对客户需求定制 ...
- Java毕设项目城市公交系统计算机(附源码+系统+数据库+LW)
Java毕设项目城市公交系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...
最新文章
- 周鸿祎对企业的深刻反思,太有借鉴意义了!
- linux shell 时间运算以及时间差计算方法
- maven搭建多模块项目和管理
- javascript --- [有趣的条件]双等号的隐式调用和数据劫持
- jquery监听向上向下滑动,滑动执行操作
- PHP学习记录_基本语法
- SQL Server 全文搜索
- android soundpool 封装,Android 音效 SoundPool 封装类 停止音效播放
- (十)统计表速查(标准正态分布、t分布、卡方分布)
- depends工具查看exe和dll依赖关系
- 薪酬体系怎么设计?看看这家把薪酬公开的公司怎么说
- SpringBoot+OCR 实现图片文字识别
- VIM插件管理:管理插件的插件pathogen
- 开启usb调试的手机如何去除屏幕锁密码
- 空气质量指数(AQI)分析与预测
- 【软件工程】敏捷宣言
- WGCLOUD和ZABBIX有什么不一样
- android 签名文件与sha1获取
- 自制导航App(包含地图、定位、自定义marker、路线制定、模拟导航等功能)
- matlab 画 带虚部,MATLAB1:求实部、虚部、模和幅角的运算