Assimp的全稱是Open Asset Import Library,一個很流行的OpenGL 3D+4D 模型處理框架。提供C/C++的API,提供C#, Java, Python, Delphi, D等語言的封裝呼叫。支援Android和iOS平臺。本文詳細介紹如何編譯適用於Android平臺的.so庫,並記錄過程中踩到的坑。
準備知識
將一個C++的工程編譯成Android平臺可用的.so庫,需要用到一些額外的工具。在開始之前,最好先了解下相關的知識點。
- make與makefile
我們在處理命令時,如果單條命令可以直接執行,但是命令比較多的時候就沒辦法挨個手動呼叫,這時候可以寫到makefile檔案裡,通過make命令批量處理。可以把make理解為批處理工具,批量處理makefile中的命令。
- cmake和CMakeLists.txt
上面提到,當命令比較多的時候,我們把命令寫到makefile中,通過make程式批量處理。但是makefile本身也比較難捱個手寫,這時候就出現了自動生成makefile的工具cmake。也就是通過cmake我們可以很方便的生成makefile檔案。那麼問題來了,cmake依據什麼來生成makefile檔案呢,很顯然,cmake通過CMakeLists.txt檔案生成makefile檔案。
- 有圖有真相(用個圖簡單描述下上面幾個工具的關係)
-
更加詳細的介紹可以參考下面的文章:
生成交叉編譯用到的toolchain
NDK提供了standalone_toolchain,通過指定一些引數,我們可以得到想要的cmake_toolchain。
NDK提供的standalone_toolchain的路徑如下:
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh
複製程式碼
export NDK_PATH=/Users/hi/Library/Android/sdk/ndk-bundle
sh make-standalone-toolchain.sh –platform=android-8 –ndk-dir=$NDK_PATH –install-dir=/Users/hi/Library/Android/sdk/android-toolchain –toolchain=arm-linux-androideabi-4.4.3
複製程式碼
如果安裝成功,sh會提示你生成的toolchain的位置的。
Package installed to /var/folders/9_/q2k248tj62x7734zchpn6btm0000gn/T/.
複製程式碼
到這個目錄下會發現名為arm-linux-androideabi.tar.bz2的壓縮檔案,請把它解壓,並放到*/Users/hi/Library/Android/sdk/android-toolchain下。在Mac下是這樣的,其他平臺應該會直接生成到/Users/hi/Library/Android/sdk/android-toolchain*目錄下。
解壓後放好,如圖:
網上有用taka-no-me的standalone_toolchain,我這裡沒用過,因為NDK已經提供了。二者有差別,我更傾向於用官方的。
相關環境和版本
Assimp官方文件沒有提供比較明確的編譯成*.so*檔案的說明。網上的資料也比較少,而且最新的也是一年前的了。在編譯的時候會有很多坑。不同的版本和環境,編譯時遇到的坑也不盡相同。我這裡列出詳細的環境和版本引數,供大家參考。
工具 | 版本 |
---|---|
作業系統 | macOS High Sierra 10.13.4 |
Assimp | 4.1.0 |
cmake | 3.11.2 |
make | GNU Make 3.81 |
NDK | 17.0.4754217 |
注:上面的環境,Assimp和NDK的版本比較重要,特別是Assimp,有些版本是有bug的,編譯時直接報錯。Release版本還有bug,服了~
基礎環境變數設定
編譯時用到的一些工具,都是通過環境變數的形式傳給指令碼。必須設定的幾個環境變數如下:
export ANDROID_NDK_PATH=/Users/hi/Library/Android/sdk/ndk-bundle // 設定DNK路徑
export ANDROID_SDK_PATH=/Users/hi/Library/Android/sdk // 設定SDK路徑
export CMAKE_TOOLCHAIN=/Users/hi/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake // 設定交叉編譯用到的toolchain,這個用NDK預設提供的就行
export ANDROID_NDK_TOOLCHAIN=/Users/hi/Library/Android/sdk/android-toolchain // 這個也必須設定,其中android-toolchain就是上面生成的啦
export PATH=$PATH:/Users/hi/Library/Android/sdk/android-toolchain/bin // 必須設定
複製程式碼
cmake生成makefile
設定了環境變數之後,我們就可以通過cmake生成makefile了。
首先執行下面的命令:
cd xxx/assimp // 下載assimp,然後解壓,進入assimp根目錄
mkdir buildAndroid // 建立資料夾
cd buildAndroid // 進入這個資料夾
複製程式碼
然後執行下面的命令。
cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN -DCMAKE_INSTALL_PREFIX=/assimp -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-14 -DANDROID_FORCE_ARM_BUILD=TRUE -DANDROID_STL=c++_shared -DASSIMP_BUILD_OBJ_IMPORTER=TRUE -DASSIMP_BUILD_FBX_IMPORTER=TRUE -DANDROID_NDK=$ANDROID_NDK_PATH -DCMAKE_BUILD_TYPE=Release -DANDROID_FORCE_ARM_BUILD=TRUE -DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing -DANDROID_TOOLCHAIN=clang -DASSIMP_BUILD_TESTS=OFF -DASSIMP_NO_EXPORT=TRUE -DASSIMP_BUILD_ASSIMP_TOOLS=FALSE -DASSIMP_BUILD_SAMPLES=FALSE -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=FALSE ..
複製程式碼
- 引數解釋
-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN 指向上面生成的toolchain
-DCMAKE_INSTALL_PREFIX=/assimp 最終生成的.so檔案的名稱
-DANDROID_ABI=armeabi-v7a 應用程式二進位制介面型別,詳見[ABI Management](https://developer.android.com/ndk/guides/abis)
-DANDROID_NATIVE_API_LEVEL=android-14 api版本,設成這個就行
-DANDROID_FORCE_ARM_BUILD=TRUE 強制編譯arm架構
-DANDROID_STL=c++_shared c++型別
-DASSIMP_BUILD_OBJ_IMPORTER=TRUE 支援OBJ格式的3D模型檔案匯入
-DASSIMP_BUILD_FBX_IMPORTER=TRUE 支援FBX格式的3D模型檔案匯入
-DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=FALSE assimp預設支援很多種3D模型格式,這裡只指定常用的一兩種格式即可,減小.so包的大小
-DASSIMP_BUILD_TESTS=OFF 這個要關掉,不然make時會有一些奇怪的錯誤
-DASSIMP_NO_EXPORT=TRUE 只需要解析3D模型,不需要生成3D模型
複製程式碼
處理成功的結果,如圖:
make
上面的步驟生成了makefile檔案,下面進行make批處理。
make -j8 // 在buildAndroid目錄下執行make操作。其中-j8是指多執行緒個數,根據自己電腦配置,選擇不同執行緒數,執行緒數越多編譯的越快。
複製程式碼
但是通常事情沒那麼簡單,這一步一般會遇到各種問題,要耐心Google,一個一個的解決。在本文的最後會附上常見的錯誤,希望能幫助到你。
獲得libassimp.so檔案
上面make如果沒出錯的話,直接去assimp/buildAndroid/code目錄下尋找libassimp.so檔案吧,這個就是我們的目標啦。
make命令常見錯誤與解決方案。
詳見本文最後的參考連結裡的坑與解決方案~
相關下載
提供下我這邊搞的libassimp.so,支援armeabi-v7。有需要的可以下載下。 連結:https://pan.baidu.com/s/1-NLds7sxxAvhOYv-2MLBAQ 密碼:b644
參考連結
我是通過下面的幾篇文章折騰出來的,有興趣的可以看下。
Assimp編譯實錄 Compile Assimp Open Source Library For Android Windows環境下編譯Assimp庫生成Android可用的.so檔案 Android NDK Adventures