Assimp Android 编译

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-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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏F_Alex

SpringCloud-微服务的注册与发现Eureka(二)

16.6K40
来自专栏冷冷

SpringMVC 文件下载时 浏览器不能正确显示另存的文件名

问题:通过打印输出流的方式把文件下载到本地,但是在firebox 中 下载的文件不显示文件的文件名,造成文件不能直接打开,其他浏览器可以直接打开. 原因: 主要...

22150
来自专栏向治洪

使用Jenkins搭建Android自动打包环境

概述 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目;监控外部调用执行的工作。 对于我们...

448100
来自专栏Albert陈凯

2018-11-28 学习SpringBoot的福音~Spring Boot 全家桶 SpringBootBucket

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。

16150
来自专栏腾讯移动品质中心TMQ的专栏

从 Ant 到 Gradle 的迁移之路

前一段时间项目组打算将原来的 Ant 编译打包方式迁移到 Gradle 编译打包方式。现在迁移基本完成,我这里将迁移过程遇到的坑以及经验做一个总结,希望能给大家...

61500
来自专栏王磊的博客

react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)

前言 目前使用一键分享比较主流的两个SDK:ShareSDK、友盟; 又因为友盟功能比较多且比较全,比如说友盟统计、友盟推送等,所以本文重点介绍的是友盟分享功能...

51990
来自专栏运维一切

moosefs的master单节点热备 原

目前还没有弄大清楚mfsmetarestore这里命令参数到底是什么意思,总体的思路是: 1、安装一个mfsmaster 2、利用同样的配置来配置这台mfsma...

10730
来自专栏程序猿DD

Spring Boot开发Web应用

《SpringBoot快速入门》 中我们完成了一个简单的RESTful Service,体验了快速开发的特性。在留言中也有朋友提到如何把处理结果渲染到页面上。那...

21660
来自专栏nnngu

JSP 和 Servlet 的工作原理和生命周期

JSP的英文名叫Java Server Pages,翻译为中文是Java服务器页面的意思,其底层就是一个简化的Servlet设计,是由sum公司主导参与建立的一...

31940
来自专栏猿天地

Elastic-Job-Spring-Boot-Starter简化你的任务配置

介绍 Elastic-Job Spring Boot 自动集成,只需要一个注解即可发布Job。 GitHub地址:https://github.com/yinj...

86180

扫码关注云+社区

领取腾讯云代金券