Assimp Android 編譯

王肖發表於2018-05-27

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檔案。

  • 有圖有真相(用個圖簡單描述下上面幾個工具的關係)

Assimp Android 編譯

生成交叉編譯用到的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*目錄下。

解壓後放好,如圖:

Assimp Android 編譯

網上有用taka-no-mestandalone_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

注:上面的環境,AssimpNDK的版本比較重要,特別是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模型
複製程式碼

處理成功的結果,如圖:

Assimp Android 編譯

make

上面的步驟生成了makefile檔案,下面進行make批處理。

make -j8 // 在buildAndroid目錄下執行make操作。其中-j8是指多執行緒個數,根據自己電腦配置,選擇不同執行緒數,執行緒數越多編譯的越快。
複製程式碼

Assimp Android 編譯

但是通常事情沒那麼簡單,這一步一般會遇到各種問題,要耐心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

相關文章