Android ndk開發:fmod語音學習(一)

鋸齒流沙發表於2017-12-27

簡介

fmod API 是一種客戶端遊戲Unity3D頁遊常用的跨平臺的音訊引擎,在過去15年中已經使用了超過2000個遊戲。

官網:https://www.fmod.com/

使用者可以到官網下載Studio使用,開發者可以下載程式設計師API,整合和外掛,進行開發。其支援的平臺非常之多:windows,linux,Android等等。

fmod.png

下載

進入官網必須要註冊賬號。我已經註冊賬號了,直接到download目錄下下載相對應平臺的 FMOD API 即可。

fmod.png

我是基於Android平臺的ndk開發的,直接下載Android版本即可。

下載解壓得到的檔案:

fmod.png

在Android平臺執行示例程式。

1)、新建一個Android工程。

2)、我需要執行示例的聲音效果,可以看到api\lowlevel\examples目錄下有effects.cpp檔案,這就是示例聲音效果的檔案。

fmod.png

3)、專案中新建JNI目錄,將effects.cpp檔案複製到JNI下,並且將lowlevel目錄下的inc檔案複製到JNI目錄,開啟lib目錄,將fmod.jar複製到專案的lib下。 將libfmod.solibfmodL.so同樣複製到JNI目錄。

fmod.png

4)、專案右鍵-------->Android Tools-------->add native support,並且將MainActivity.java檔案替換成FMOD示例的MainActivity.java檔案,且要更改包名。

5)、Android.mk配置

fmod.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

如下我已經將需要的標頭檔案加入到JNI目錄下了

fmod.png

但是還是報錯:

fmod.png

將需要的標頭檔案再NDK目錄下找到,並把路徑新增進來。專案右鍵----->properties:

fmod.png

fmod.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.cppcommon.cpp編譯

fmod.png

重新build下專案還是錯誤:

fmod.png

原因,專案中沒有加入C++ STL標準庫。

新建Application.mk檔案,加入STL標準庫

再NDK開發文件說明,使用C++ STL需要再JNI目錄下新建Application.mk,加入STL標準庫

fmod.png

同樣需要再C/C++ general中加入檔案路徑:

fmod.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

原因:沒有生成mip64架構的so檔案,再obj目錄下找不到這個so庫

fmod.png

解決方法:再Application.mk加入APP_ABI

fmod.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

fmod.png

也可以使用播放聲音的play_sound.cpp檔案來執行試一下效果,只需要Android.mk替換下effects.cpp就可以了。

fmod.png

至此,整個FMOD示例在Android上執行起來了。如果想了解更多,需要細心的閱讀示例程式程式碼。

相關文章