Assimp编译实录

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fyfcauc/article/details/72627996

Assimp相关:

Assimp(https://github.com/assimp/assimp)是一个轻量级的3D模型解析和转换库,支持40+的格式,一些小的3D引擎会使用其作为自己的模型解析加载模块,受众相对比较广泛。该库一直保持着更新,尽管ISSUE不少,不过从目前的小范围使用情况来看,可靠性还可以接受

Assimp Android端编译:

Assimp本身提供了Android编译适配,在其源码目录assimp/port/AndoridJNI下的CMakeList.txt可以产出一个通过JNI方式适配IO的库,不过我们当前的需求不需要通过这种方式来适配IO,我们需要的是一个纯粹的C++库提供Assimp的功能即可, 另外该脚本中基本没有提供android控制项(也有可能在其他的配置文件中,但是没有找到)。出于上面这些原因,决定进行自行编译。

资料参考:

网上能找到为Android编译Assimp库的资料很少,有操作参考价值的只有这一篇: http://www.myandroidonline.com/2015/06/09/compile-assimp-open-source-library-for-android/  这篇文章提供的基本思路视是对的,不过因为时间比较早,不能完全照搬。

操作流程:

    • 安装 Android SDK/Android NDK,我们这里使用的NDK版本是r14。
    • 配置NDK_PATH指向装好的NDK目录路径。
    • 进入NDK目录下的build/tools, 运行 sh make-standalone-toolchain.sh --platform=android-9 --install-dir=/tmp/Android/sdk/android-toolchain --toolchain=arm-linux-androideabi-4.9 生成编译时需要用到的交叉编译ToolChain(Android ToolChain: https://developer.android.google.cn/ndk/guides/standalone_toolchain.html?hl=zh-cn#sys)。上述的–install-dir后面指定生成的ToolChain存放到哪个目录中,当前是/tmp/Android/sdk/android-toolchain目录。
    • 如果上面一步出现了NDK版本错误的提示(如果你使用的NDK版本>=13, 可能会有这个问题),这是NDK的一个bug,可以修改NDK目录下的source.properties中的“Pkg.Revision = 12.X.XXX”来规避这个问题。
    • MAC上生成ToolChain有可能不能存放到你指定的install-dir中,但是会提示你ToolChain被打包成一个zip放在某个地方,你只需要去找到这个zip并解压到你希望的目录即可。还要注意: install-dir要设置为绝对路径(并且不要设置到你的账户权限不能访问的目录)。
    • 至此,ToolChain 交叉编译环境已经就绪了。
    • 下一步需要配置系统变量,参考最上面的文章配置即可。
    • 然后进入到Assimp的源码目录,在其目录下创建一个buildAndroid目录(名称随意),在该名称下运行: cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN -DCMAKE_INSTALL_PREFIX=/assimp-3.0 -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-10 -DANDROID_FORCE_ARM_BUILD=TRUE -DANDROID_STL=gnustl_static -DASSIMP_BUILD_OBJ_IMPORTER=TRUE -DASSIMP_BUILD_FBX_IMPORTER=TRUE ..
      • 上述命令中的cmake使用的是AndroidSDK中附带的cmake(比如在我这里是: sdk/cmake/3.6.3155560/bin/cmake),所以你要确保你的PATH中包含了AndroidSDK中cmake所在的目录路径
      • ANDROID_STL=gnustl_static中指定了编译时使用哪个C库,后续在使用编译出来的Assimp库时,Application.mk中要配置同样的C库
      • -DASSIMP_BUILD_OBJ_IMPORTER=TRUE -DASSIMP_BUILD_FBX_IMPORTER=TRUE是关于格式选择的,这个后面专门讲
      • ..   这个很重要表示上级目录,而上级目录则是CMakeLists.txt存放的地方
    • 命令运行完以后,会在buildAndroid目录生成真正编译所需的文件,包括最关键的Makefile文件,该Makefile本身提供了几个选项,make install/strip基本就够用,最后生成的库文件会放在buildAndroid/code下,名称是libassimp.a/so.
    • 最后可以调用toolchain下的strip  --strip-unneeded对库进行精简,不过Android的ndk编译完成后也会替你做这个事情。

Assimp定制化:

Assimp的CMakeLists.txt中提供了很多定制项,很多功能/模块作为独立的可编译功能存在,一些不必要的功能可以剥离掉以减小库的体积。

    • 主目录下的CMakeLists.txt的几个关键定制项:
      • BUILD_SHARED_LIBS 编译Assimp静态库还是动态库。
      • ASSIMP_ANDROID_JNIIOSYSTEM 是否开启Android上JNI IO桥接,在这里我们选择FALSE,因为IO直接在native层就做了。
      • ASSIMP_NO_EXPORT 剥离Assimp的输出功能(模型格式转换+输出),在这里我们选择FALSE,因为我们只需要IMPORT功能。
      • ASSIMP_BUILD_ZLIB 使用使用你自己的ZLIB,这个无所谓。
      • ASSIMP_BUILD_ASSIMP_TOOLS Assimp的一些相关tool是否也被集成,我们这里没有需求,FALSE。
      • ASSIMP_BUILD_SAMPLES Sample是否也集成,FALSE。
      • ASSIMP_BUILD_TESTS 是否集成test,FALSE。
    • code/CMakeLists.txt提供了一个关键的定制项,Assimp支持很多格式,但是在实际使用中,除非本身就是一个3D模型查看器或者转换器,佛足额最终可能就固定使用那么2,3个格式。显然编译时把其他的格式编进去是无用且浪费的,徒增库的大小。
      • ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT 控制编译时是否默认将所有的格式包含进来,设置为FALSE代表默认不包含任何格式。要支持某个格式,只需要在上面的cmake命令后面附加-DASSIMP_BUILD_XXX(格式名称)_IMPORTER=TRUE即可, 这就是上面-DASSIMP_BUILD_OBJ_IMPORTER=TRUE -DASSIMP_BUILD_FBX_IMPORTER=TRUE的来历。
      • 测试结果: 

         
        静态库大小 (MB)
        Stripped静态库大小(MB)
        集成到3D贴纸后,3D贴纸库大小(MB)
        所有格式 170 100 12
        obj+fbx 37 18 4

编译中遇到的问题:

    • dynamic_cast找不到,需要增加-frtti编译参数,可以在 CMakeLists.txt中进行修改

    • 需要支持exception机制,增加-fexcepions编译参数
    • -lpthread找不到,该库在NDK已经集成到Bioic中了,不需要单独列出来,直接删除即可

    • atof not find,头文件没包含,include一下


展开阅读全文

没有更多推荐了,返回首页