完美编译街机模拟器MAME(Android版)基于MAME4all
重新编译MAME4droid源码
github上开源项目MAME4all可将MAME模拟器运行在iOS和Android上,还有一个比较有名的叫MAME4droid(MAME for android),MAME4all支持iOS,因此我选择了它。但由于年代比较久远(7-8年前的项目),代码clone下来基本无法编译。
原项目虽然在github上开源,但从目录结构上可看出原项目是svn做的版本控制,这也很正常,毕竟那时github还没流行起来。首先把代码clone下来,为了方便记录升级过程,并且方便读者clone,笔者将源项目分割。基于最后一个tag “MAME4droid 1.9.2 (0.139u1)”来修改,代码已上到我的github MAME4Mobile。本文将基于此来修改编译
环境:
- Mac OS X 10.14.4
- Android Studio 3.5.2
- NDK 17.2.4988734
一、导入Android Studio
原android项目应该是基于Eclipse。用Android Studio菜单的File -> New -> Import project ... 导入为AS的工程,最终工程笔者已经上到github
二、编译libMAME4droid
此步骤比较麻烦,主要工作都集中于此步。
1. 配置makefile
此处历经周折, mrpostiga/imame4all 的makefile配置需要依赖本地NDK环境,因此需要配置各种路径,include, ldflag。尝试了gcc、clang等编译失败,文件中的好多写法不被clang接受,而且makefile中的编译选项是gnu的 (0_0)。最终由于源码是混合了c与c++而如果编译器根据文件后缀来确定语言类型将导致编译出错。我选择使用g++,既可以编译C又可以编译C++。
NDK 笔者使用NDK 17.2.4988734,原因是 安卓自NDK-r18起移除了gcc, 并完全删除了gnustl、gabi++ 和 stlport。而模拟器源码使用了stl。
具体配置详见github makefile 文件
2. 编译
(建议直接在我的git根目录下执行make,这里编译一次要很久,而且有时遇到修改,make命令不能中途自动更新obj文件,导致重新编译好多次,太花时间)
编译报错 opensl_snd.c:51:30: error: 'memcpy' was not declared in this scope, 找不到memcpy。解决办法 在opensl_snd.c中添加#include <string.h>
aarch64-linux-android/bin/ld: cannot find crtbegin_so.o: No such file or directory和aarch64-linux-android/bin/ld: cannot find crtend_so.o: No such file or directory 不知道为什么ld始终找不到这2个.o 配置了-L选项也不行,最后没办法把crtbegin_so.o,crtend_so.o拷到makefile同级目录Linking通过。(后来改为ln -s 软连接的方式,已配置到makefile实现自动ln armv7a和armv8a。
libMAME4droid.so: dlopen failed: cannot locate symbol "_ZNSs4_Rep20_S_empty_rep_storageE" 找不到_ZNSs4_Rep20_S_empty_rep_storageE这个符号,经查是c++ string类型的默认值,感觉是手机上没有找到这个,试了把libgnustl_shared.so打到apk包里,运行解决。(我用旧版本的AS-3.4.1 在Application.mk中配置了APP_STL := gnustl_shared后,nkd-build 会自动将libgnustl_shared.so拷贝到libs/armeabi-xxx目录下,升级3.5之后就没有这个行为了,不知道是不是AS改了这方面功能)
编译的最终结果将得到一个名为mame或mame64的二进制文件,即我们的 libMAME4droid.so 库。
当然工程里面还需要配置一下编译jni文件,你可以选择使用ndk-build或是cmake。两种我都写了一下,改下app的build.gradle可以切换两种编译方式。

3. 适配
Run起来后,手机在横屏状态下,会发现摇杆和A、B、X、Y 都挡住游戏画面了,而且两边还有很多空白区。如图:

这里笔者简单适配一下最终效果,看图

这个顺眼多了。界面布局配置写在配置文件里面,位于res下的raw目录。数字的第一列表示控件类型,第二列代表控件ID,第三列x轴坐标... 感兴趣的同学看下MainHelper -> inputHandler.readControllerValues

原作者由于基于当时的Android设备来配置屏幕空间。在当下Android手机上显然是不适配的,小弟就简单的将raw-large中的16_9内容复制到raw中,在我的荣耀V10上效果如上图。
4. 运行
最后 投币、start就可以愉快的玩耍了。

三、总结
MAME是一个跨平台的街机模拟器引擎,但最新版貌似没有考虑兼容移动设备。本文使用的核心源码是比较老的0.139u1版本,在网上找ROM的时候也要留意下版本兼容性。
还有一个iOS版我还没编译,留到下次吧~~(项目好忙)
最近半年多一直在弄Android,好久没搞iOS了,不知道swift啊、xcode啊又加了什么新特性。自从苹果出了刘海屏,越来越不待见苹果了~
完美编译街机模拟器MAME(Android版)基于MAME4all的更多相关文章
- MAME 0.201 发布,重温童年的街机模拟器
MAME 0.201 已发布,MAME 最初是街机模拟器,随着时间的推移,MAME 吸收了姊妹项目 MESS(多机种模拟器超级系统),所以 MAME 现在还记录了各种各样的(大多是老式的)电脑游戏.掌 ...
- Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc 1. #-------常用 游戏类型 1 2. 街机的历史 2 3. #=========== ...
- AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机)
AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机) 特别感谢google官方文档及AOSP源代码开放 參考链接: https://source.a ...
- 完美高仿精仿京东商城手机客户端android版源码
完美高仿精仿京东商城手机客户端android版源码,是从安卓教程网那边转载过来的,这款应用源码非常不错的,也是一个非常优秀的应用源码的,希望能够帮到学习的朋友. _js_op> <igno ...
- 利用lipo编译合并iPhone模拟器和真机通用的静态类
利用lipo编译合并iPhone模拟器和真机通用的静态类 如何编译静态类库,而且现在网上也有很多的教程,现在问题时我们编译好了的静态类库会时两个版本的.a文件,分别用于模拟器和iPhone真迹,因此M ...
- Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路
Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...
- 业余时间折腾了个微信小程序版本的街机游戏模拟器(吾爱街机),8090后的童年回忆,欢迎大家体验
好多年没来博客园了,有段时间想玩街机游戏,发现都需要下载安装,现在小程序这么流行,是不是可以集成到小程序里(无需下载,在线玩),出于这想法,就业余时间折腾了下,分享给大家,偶尔可以回味畅玩下. 中间遇 ...
- 最牛叉的街机游戏合集 & 模拟器
亲爱的小伙伴们,是否还记得那年我们玩的疯狂的街机游戏吗,街机中心提供400多个街机游戏,让你爽到底. 例如:拳皇96,拳皇97,恐龙新世纪.名将.快打旋风.惩罚者.魂斗罗.超级玛丽.雪山兄弟.忍者神龟 ...
- 开发腾讯移动游戏平台SDK Android版Ane扩展 总结
本文记录了在开发 腾讯移动游戏平台SDK(MSDK) Android版Ane扩展 过程中所遇到的问题和相关解决方式 问题一:编译报错:Unable to resolve target 'android ...
随机推荐
- php中mkdir()函数的权限问题(转)
问题描述: 使用以下php代码创建了一个目录,期望目录的权限是0777,实际结果是0755 mkdir('./aa/',0777); 分析与测试结果: 1.mkdir()函数指定的目录权限只能小于等于 ...
- Java连接ActiveMQ代码示例(Producer和Consumer)
import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; ...
- 小米手机 - Charles无法安装证书 因为无法读取证书
1.不要使用小米原装的浏览器安装证书 2.使用第三方浏览器安装,如我使用的是UC浏览器 3.使用第三方浏览器安装的证书格式是".pem"格式问卷 4.将这个文件放入小米的downl ...
- Nodejs base64编码与解码
1、普通字符串 //编码 new Buffer(String).toString('base64'); //解码 new Buffer(base64Str, 'base64').toString(); ...
- anyka安凯微电子
http://www.anyka.com/ 幼教机
- 写MySQL存储过程实现动态执行SQL
转自:http://www.cnblogs.com/william-lin/archive/2013/03/19/2968727.html--存储过程名和参数,参数中in表示传入参数,out标示传出参 ...
- redis集群扩容(添加新节点)
一.创建节点(接上文) 1.在H1服务器/root/soft目录下创建7002目录 2.将7001目录的配置文件redis.conf拷贝到7002,并修改配置文件的端口 3.进入 redis-5.0. ...
- jq 手机键盘消失出现白色延迟
input 输入框失去焦点 $("#input").blur() 接口调用setTimeout 让输入框消失后再出现loading和调用接口 ios手机loading覆盖不完全 自 ...
- ftp的虚拟用户的使用
虚拟用户原理 因为在linux之下,使用vsftp建立用户之后,默认使用ftp访问的时候,是会访问到对应的用户家目录.如果想多个用户同时访问某一个目录,同时对同一目录下有着不同的权限,比如部分用户只能 ...
- Ubuntu 图形桌面死机重启(机器不重启)
Ubuntu的图形界面容易死机,如果正在跑程序的话又不能重启.这时候可以通过终端来_重启_图形界面. 首先按Alt+Ctrl+F1进入终端界面.查看图形界面的进程: ps -t tty7 查看到名为X ...