簡介
fmod API 是一種客戶端遊戲
和Unity3D頁遊
常用的跨平臺的音訊引擎,在過去15年中已經使用了超過2000個遊戲。
官網:https://www.fmod.com/
使用者可以到官網下載Studio使用,開發者可以下載程式設計師API,整合和外掛,進行開發。其支援的平臺非常之多:windows,linux,Android等等。
![fmod.png](https://i.iter01.com/images/0111c0b79d0d439ecc0d8d671da781a3608c88ea0c267e7536b72387865beb3a.png)
下載
進入官網必須要註冊賬號。我已經註冊賬號了,直接到download
目錄下下載相對應平臺的 FMOD API
即可。
![fmod.png](https://i.iter01.com/images/ceaf5ddf243bb2211872612c24518b9b9dee380d18fce34ff04323240bb967bb.png)
我是基於Android平臺的ndk開發的,直接下載Android版本即可。
下載解壓得到的檔案:
![fmod.png](https://i.iter01.com/images/557d35a596ca4989b9a95cd6ed355407f3b7f7fd04e65ef72beef7a6cebf21c9.png)
在Android平臺執行示例程式。
1)、新建一個Android工程。
2)、我需要執行示例的聲音效果,可以看到api\lowlevel\examples
目錄下有effects.cpp
檔案,這就是示例聲音效果的檔案。
![fmod.png](https://i.iter01.com/images/d095b759d154972cbacbfa17bd2a0d31b85ab27731b129fd4345c0af273e55ea.png)
3)、專案中新建JNI目錄,將effects.cpp
檔案複製到JNI下,並且將lowlevel
目錄下的inc
檔案複製到JNI目錄,開啟lib
目錄,將fmod.jar
複製到專案的lib
下。
將libfmod.so
和libfmodL.so
同樣複製到JNI目錄。
![fmod.png](https://i.iter01.com/images/432972e1a003b68c3a639f4edf2a46eaeaece67ed25cef62cc3e9cd6bb938a54.png)
4)、專案右鍵-------->Android Tools-------->add native support,並且將MainActivity.java檔案替換成FMOD示例的MainActivity.java檔案,且要更改包名。
5)、Android.mk配置
![fmod.png](https://i.iter01.com/images/57a6fde27c4d7089b0e8bd6f2702f45c5e0a2da2118cadf67e09f25eb5b3ed77.png)
include $(CLEAR_VARS)
LOCAL_MODULE := fmod
LOCAL_SRC_FILES := libfmod.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := fmodL
LOCAL_SRC_FILES := libfmodL.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
複製程式碼
6)、開啟effect.cpp
,將需要的標頭檔案以及標頭檔案的實現檔案進入到JNI目錄下。
![fmod.png](https://i.iter01.com/images/de0b1c6cfda9f61e9c3d1800093f37e6257e725a1370d34dc2fc0e85eee647a1.png)
如下我已經將需要的標頭檔案加入到JNI目錄下了
![fmod.png](https://i.iter01.com/images/45e46d490a3b0360011a85c87da2d1f8dea80f3504eefbd7a9d0f5c9b3877645.png)
但是還是報錯:
![fmod.png](https://i.iter01.com/images/4f35216db7f932fbde1ea71a7211f51836fc947d43627739bc4d2595567249a5.png)
將需要的標頭檔案再NDK目錄下找到,並把路徑新增進來。專案右鍵----->properties:
![fmod.png](https://i.iter01.com/images/a123b08e3bf8298576e5836d72e5ba35cd6687c8578dd75d7edc843a17e1160d.png)
![fmod.png](https://i.iter01.com/images/1dfc160c1899cf543203312d815af0d08ed7ac1e2d73b56ec5c498cbdeb9a4d9.png)
以下是我加入的路徑:
E:\ndk\android-ndk-r14b-windows-x86_64\android-ndk-r14b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x\include
E:\ndk\android-ndk-r14b-windows-x86_64\android-ndk-r14b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x\include-fixed
E:\ndk\android-ndk-r14b-windows-x86_64\android-ndk-r14b\platforms\android-21\arch-arm\usr\include
複製程式碼
再Android.mk檔案加入common_platform.cpp
和common.cpp
編譯
![fmod.png](https://i.iter01.com/images/46dc450afc9859794184b2d125aff13a1a59313fd520a7deb20919fef69593ce.png)
重新build下專案還是錯誤:
![fmod.png](https://i.iter01.com/images/fbb67eaef68f5f6b282ac8d666275844cfdb6b05f89825aa7d6a20ce10a275d0.png)
原因,專案中沒有加入C++ STL標準庫。
新建Application.mk
檔案,加入STL標準庫
再NDK開發文件說明,使用C++ STL需要再JNI目錄下新建Application.mk
,加入STL標準庫
![fmod.png](https://i.iter01.com/images/53d528dae2df735ac3f25334ee2c8be488abfeed81a958cb03348ffb736682b4.png)
同樣需要再C/C++ general中加入檔案路徑:
![fmod.png](https://i.iter01.com/images/894bfa3f986fe833e2466238b835a0958990ad34dd296f9a84fd7b6f33fab97c.png)
我加入的檔案路徑是:
E:\ndk\android-ndk-r14b-windows-x86_64\android-ndk-r14b\sources\cxx-stl\stlport\stlport
複製程式碼
讀者也可以參考這篇文章Android學習筆記——NDK中C++標準庫、STL的配置;Include其他標頭檔案
重新build專案,報了這個錯誤clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
![fmod.png](https://i.iter01.com/images/d8684d70e980d351f9fb34325d6ba9f518b85f39c15a5009c6e1098554fed8b6.png)
原因:沒有生成mip64架構的so檔案,再obj目錄下找不到這個so庫
![fmod.png](https://i.iter01.com/images/e5fb16fd0b4a2bb13a551e868f64e9b60bc2a5fe2acd11755859f7d9a0bde8db.png)
解決方法:再Application.mk加入APP_ABI
![fmod.png](https://i.iter01.com/images/691f31e803067a888a7dd9723adae0571241daae3449ec8fc3e02fa299dd2804.png)
#####支援C++異常處理,標準莫板塊
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a #必須指定生成mip64架構的so檔案,否則出錯
複製程式碼
關於這個問題,可以參考 Error:error: linker command failed with exit code 1 (use -v to see invocation)這篇文章。
然後執行Android專案,沒問題了,並且能夠執行起來了。
![fmod.png](https://i.iter01.com/images/b1b4dc3944d05840ebc24166b28319cc0539f9a0e92de1163ab223dafb41cff9.png)
![fmod.png](https://i.iter01.com/images/9feddc04bc9ab3fda392c327e5cb8f0ae2a72b63f02d8d0f2e1475764022dde5.png)
也可以使用播放聲音的play_sound.cpp
檔案來執行試一下效果,只需要Android.mk替換下effects.cpp就可以了。
![fmod.png](https://i.iter01.com/images/96664b46196f0b76b1a8c841cdeee122e6789782abda63efee0f0ddab10f818d.png)
至此,整個FMOD示例在Android上執行起來了。如果想了解更多,需要細心的閱讀示例程式程式碼。