Ogre 1.10 Android平臺編譯筆記

編譯平臺Windows + CMake +VisualStudio 2015

安裝Android SDK 、Android NDK和Mercurial

怎麼安裝就不介紹了。NDK版本我使用的是r10e。安裝完畢之後,需要在系統中添加ANDROID_SDK和ANDROID_NDK兩個環境變量,分別指向安裝好的SDK和NDK的目錄,同時把%ANDROID_SDK%\tools, %ANDROID_SDK%\platform-tools, and %ANDROID_NDK%這三個路徑都添加到系統的PATH環境變量。這一步非常重要,執行cmake命令前請務必檢查。
使用下面的指令,查看環境變量是否設置好了:
這裏寫圖片描述
這裏寫圖片描述
下載源代碼需要使用Mercurial工具,請自行安裝。恕不贅述。

下載官方編譯好的Android依賴庫

http://sourceforge.net/projects/ogre/files/ogre-dependencies-android/1.9/AndroidDependencies.zip/download
從上面的地址下載編譯好的Android依賴庫。
如果你的NDK的版本是r10b及以下的話,可以直接使用上面編譯好的依賴庫。但是NDK從r10c開始,移除了很多C庫的實現,所以,如果你用高版本的NDK,在鏈接Ogre庫的時候肯定會出現一些未定義的符號。解決的辦法是,自己用高版本的NDK編譯出Android依賴庫。

自己編譯Android依賴庫(可選)

假如你的NDK版本是r10b及以下,這一步可以跳過。
首先下載ogredeps源代碼:
hg clone https://bitbucket.org/cabalistic/ogredeps
下載完畢後,先別編譯,官方源代碼裏面的toolchain腳本有問題,不能正確的交叉編譯,請下載我這裏提供的腳本覆蓋掉cmake/android.toolchain.cmake。
鏈接:http://pan.baidu.com/s/1eR0jobC 密碼:ll84

進入ogredeps目錄,執行下面的一系列命令進行編譯:
mkdir build & cd build
cmake -DCMAKE_TOOLCHAIN_FILE=”../cmake/android.toolchain.cmake” -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=10 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DCMAKE_INSTALL_PREFIX=G:\mydev\Bitbucket\ogredeps\AndroidDependencies ..
之後打開生成的OGREDEPS.sln,進行編譯。

注意,我們只需要Release版本的庫,不要編譯出Debug版本的庫,編譯出來也要手動刪掉。不刪,後面編譯Ogre時生成的腳本會出錯。最後,把編譯出來的庫,放到目錄armeabi-v7a下面,形式如下

這裏寫圖片描述

獲取Ogre1.10源代碼

執行下面的命令,將源代碼拷到本地:
hg clone https://bitbucket.org/sinbad/ogre

編譯前的準備工作

將第二步(或者第三步)獲得的Android依賴庫解壓,分別複製到ogre源碼的根目錄和build目錄下面。做完之後,目錄結構如下:

ogre/AndroidDependencies
ogre/build/AndroidDependencies

之所以要拷貝兩份,因爲Ogre提供的cmake交叉編譯的腳本處理包含路徑的時候有點錯誤,它搜索的時候用的路徑和生成的時候用的路徑搞錯了,不改了,能解決問題就行。

生成編譯工程文件

我們進入ogre/build目錄下,打開命令行,執行下面的命令,生成VS2015的工程文件:

cmake -DCMAKE_TOOLCHAIN_FILE=”../CMake/toolchain/android.toolchain.cmake” -DOGRE_DEPENDENCIES_DIR=”./AndroidDependencies” -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=10 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 ..

如果沒有錯誤,cmake會有這樣的提示
這裏寫圖片描述

注意,toolchain,用4.9版本,4.8版本鏈接會出現未定義的符號。原因不明。

編譯

打開build目錄下生成的Ogre.sln,F7即可編譯。
除了SampleBrowserDummy這個工程,其他的都能夠正確的編譯。jni提示說找不到編譯出來的*.a庫。打開
build/SampleBrowserNDK/jni/Android.mk文件,發現在生成Android編譯腳本的時候沒有處理是Debug版本的庫還是Release版本的庫,
我用的比較臨時的解決辦法,直接把build/lib/Release(或者Debug)/目錄下面的*.a全部複製到build/lib目錄下面,再編譯,SampleBrowserNDK就能正確鏈接了。
當然解決辦法很醜陋,不過我只需要編譯一個Release版本出來,這麼做也不會出現意外的情況。徹底的辦法,當然是去修改CMake腳本,留給官方去改吧。

ogre/build/SampleBrowserNDK下面是自動生成的Android工程,命令行切換到此目錄,我們來生成APK文件。

android list targets

上面的命令用於列出當前AndroidSDK支持的API level,記住序號對應的API level。我的機器上有兩個:

這裏寫圖片描述

android update project -t 1 -p .
ndk-build all
ant debug install

最後一條命令,把生成的apk安裝到模擬器或者實際硬件上。
本以爲到此就算完成了,手機上一運行發現段錯誤,好蛋疼。

繼續折騰吧,定位到源代碼發現是RenderSystem在沒有初始化GpuProgramManager的情況下,就調用了GpuProgramManager::getSingleton(),將OgreRenderSystem.cpp 163行,做如下的修改:

#if OGRE_PLATFORM != OGRE_PLATFORM_ANDROID
        GpuProgramManager::getSingleton().setEnableMicrocodeCache(true);
#endif

重新編譯,生成APK,安裝到手機,總算大功告成!截圖留念:

這裏寫圖片描述
這裏寫圖片描述

錯誤處理

如果在第5步,提示找不到AndroidSDK的android這個可執行程序,就需要修改cmake腳本。具體步驟如下:
打開ogre/CMake/Utils/AndroidMacros.cmake這個文件,對77行做如下修改
這裏寫圖片描述

如果你打開Ogre.sln,發現沒有Sample_XXX的工程,說明你的AndroidDependencies放置的位置不對,注意檢查。

總結

做以上所有的工作,花了我半天的時間。總的來說,Ogre對Android支持還過得去,有坑,但是並不是太大的坑,多嘗試幾次就可以找到解決方案。
雖然本人已經不用它了,但是看到它能正確運行到手機上,還是一件挺有趣的事情。
以上,歡迎指正。

下載

我把編譯好的SDK和APK放出來,供需要的人下載測試,也省去自己編譯的麻煩。

APK文件 鏈接:http://pan.baidu.com/s/1skb06XB 密碼:gb5u
SDK 鏈接:http://pan.baidu.com/s/1jHrnTD8 密碼:5xtr

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章