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
咱们在处理命令时,若是单条命令能够直接执行,可是命令比较多的时候就没办法挨个手动调用,这时候能够写到makefile文件里,经过make命令批量处理。能够把make理解为批处理工具,批量处理makefile中的命令。android
上面提到,当命令比较多的时候,咱们把命令写到makefile中,经过make程序批量处理。可是makefile自己也比较难挨个手写,这时候就出现了自动生成makefile的工具cmake。也就是经过cmake咱们能够很方便的生成makefile文件。那么问题来了,cmake依据什么来生成makefile文件呢,很显然,cmake经过CMakeLists.txt文件生成makefile文件。c++
更加详细的介绍能够参考下面的文章:git
NDK提供了standalone_toolchain,经过指定一些参数,咱们能够获得想要的cmake_toolchain。github
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-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了。
首先执行下面的命令:
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模型
复制代码
处理成功的结果,如图:
上面的步骤生成了makefile文件,下面进行make批处理。
make -j8 // 在buildAndroid目录下执行make操做。其中-j8是指多线程个数,根据本身电脑配置,选择不一样线程数,线程数越多编译的越快。
复制代码
可是一般事情没那么简单,这一步通常会遇到各类问题,要耐心Google,一个一个的解决。在本文的最后会附上常见的错误,但愿能帮助到你。
上面make若是没出错的话,直接去assimp/buildAndroid/code目录下寻找libassimp.so文件吧,这个就是咱们的目标啦。
详见本文最后的参考连接里的坑与解决方案~
提供下我这边搞的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