完美編譯街機模擬器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。本文將基於此來修改編譯

環境:

  1. Mac OS X 10.14.4
  2. Android Studio 3.5.2
  3. 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. 編譯

編譯報錯  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啊又加了什么新特性。自從蘋果出了劉海屏,越來越不待見蘋果了~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM