Assimp Android 編譯

Assimp的全稱是Open Asset Import Library,一個很流行的OpenGL 3D+4D 模型處理框架。提供C/C++的API,提供C#, Java, Python, Delphi, D等語言的封裝調用。支持Android和iOS平臺。本文詳細介紹如何編譯適用於Android平臺的.so庫,並記錄過程當中踩到的坑。html

準備知識

將一個C++的工程編譯成Android平臺可用的.so庫,須要用到一些額外的工具。在開始以前,最好先了解下相關的知識點。linux

  • make與makefile

咱們在處理命令時,若是單條命令能夠直接執行,可是命令比較多的時候就沒辦法挨個手動調用,這時候能夠寫到makefile文件裏,經過make命令批量處理。能夠把make理解爲批處理工具,批量處理makefile中的命令。android

  • cmake和CMakeLists.txt

上面提到,當命令比較多的時候,咱們把命令寫到makefile中,經過make程序批量處理。可是makefile自己也比較難捱個手寫,這時候就出現了自動生成makefile的工具cmake。也就是經過cmake咱們能夠很方便的生成makefile文件。那麼問題來了,cmake依據什麼來生成makefile文件呢,很顯然,cmake經過CMakeLists.txt文件生成makefile文件。c++

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

生成交叉編譯用到的toolchain

NDK提供了standalone_toolchain,經過指定一些參數,咱們能夠獲得想要的cmake_toolchaingithub

NDK提供的standalone_toolchain的路徑以下:shell

$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的位置的。api

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*目錄下。bash

解壓後放好,如圖:多線程

網上有用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模型
複製代碼

處理成功的結果,如圖:

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

相關文章
相關標籤/搜索