本文通过描述一次完整的移植 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系统相关推荐

  1. 分享OMS系统实战的三两事

    OMS系统实战 1. 前言 2. 架构设计 2.1 业务架构 2.2 系统架构 3. 功能演进 3.1 单据业务演进 3.2 库存管理演进 4. 一般功能设计 4.1 关联数据映射 4.2 状态数据隔 ...

  2. Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统主要实现的功能有: 网上商城系统,前台+后台管理,用户注册,登录,上架展示,分组展示,搜索,收货地址管理,购物车管理,添 ...

  3. Java项目:在线考试系统(java+springboot+vue+jsp+mysql+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统主要实现的功能有: 学生以及老师的注册登录,在线考试,错题查询,学生管理,问题管理,错题管理,错题查询,分数查询,试卷管 ...

  4. 项目集成自动分词系统ansj,实现自定义词库

    一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...

  5. C小项目 —— 学生选课系统

    C小项目 -- 学生选课系统 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include&l ...

  6. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...

    背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...

  7. 下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》

    基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1c3zLGZ2 密码:e7 ...

  8. 使软件可二次开发_九思软件:平台型OA系统为何要好于项目型OA系统?

    现代企业往往会把企业战略落实在项目中,所以在OA系统选型中很多企业过于侧重项目管理,选择项目型OA办公系统.然而,随着信息化的发展,传统的OA产品已无法满足于企业不断拓展的个性化需求,针对客户需求定制 ...

  9. Java毕设项目城市公交系统计算机(附源码+系统+数据库+LW)

    Java毕设项目城市公交系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

最新文章

  1. 周鸿祎对企业的深刻反思,太有借鉴意义了!
  2. linux shell 时间运算以及时间差计算方法
  3. maven搭建多模块项目和管理
  4. javascript --- [有趣的条件]双等号的隐式调用和数据劫持
  5. jquery监听向上向下滑动,滑动执行操作
  6. PHP学习记录_基本语法
  7. SQL Server 全文搜索
  8. android soundpool 封装,Android 音效 SoundPool 封装类 停止音效播放
  9. (十)统计表速查(标准正态分布、t分布、卡方分布)
  10. depends工具查看exe和dll依赖关系
  11. 薪酬体系怎么设计?看看这家把薪酬公开的公司怎么说
  12. SpringBoot+OCR 实现图片文字识别
  13. VIM插件管理:管理插件的插件pathogen
  14. 开启usb调试的手机如何去除屏幕锁密码
  15. 空气质量指数(AQI)分析与预测
  16. 【软件工程】敏捷宣言
  17. WGCLOUD和ZABBIX有什么不一样
  18. android 签名文件与sha1获取
  19. 自制导航App(包含地图、定位、自定义marker、路线制定、模拟导航等功能)
  20. matlab 画 带虚部,MATLAB1:求实部、虚部、模和幅角的运算

热门文章

  1. E4A第二期-微型计算器
  2. NGUI与Unity3d物体交叉显示的一种解决方案
  3. 屏保 cmatrix
  4. novatel oem7 串口配置软件 程序说明1
  5. 炒币机器人如何助你韭菜被割还能褥到羊毛
  6. 基于JAVA餐厅座位预约系统设计与实现 开题报告
  7. JS实现字符串加密解密
  8. 强强合作,替代钉盘/微盘,企业实现低成本扩容
  9. docker containerd.io、docker-ce、docker-ce-cli的区别(docker版本安装docker安装方法)(Docker CE和Docker EE,docker.io)
  10. BarTender打印流水号