Android平台使用Ceres Solver
在Android平台上使用Ceres求解器,官方教程不明确,且编译过程遇到了很多问题。
环境
Ubuntu 18.04
源代码
https://github.com/Great-Keith/ceres-android
准备工作
Eigen 3.3.7(最新):在编译Ceres的时候需要使用。
NDK r20(最新):NDK r14b版本无法使用,建议使用高于14的版本。
Ceres 1.14.0(最新)已经附带在仓库中。
[NOTE] Ceres其他依赖项按照官方教程进行配置,建议先检验Linux系统下是否能够安装成功。
# 官方安装指导 http://ceres-solver.org/installation.html
# CMake
sudo apt-get install cmake
# google-glog + gflags
sudo apt-get install libgoogle-glog-dev
# BLAS & LAPACK
sudo apt-get install libatlas-base-dev
# Eigen3
sudo apt-get install libeigen3-dev
# SuiteSparse and CXSparse (optional)
# - If you want to build Ceres as a *static* library (the default)
# you can use the SuiteSparse package in the main Ubuntu package
# repository:
sudo apt-get install libsuitesparse-dev
# - However, if you want to build Ceres as a *shared* library, you must
# add the following PPA:
sudo add-apt-repository ppa:bzindovic/suitesparse-bugfix-1319687
sudo apt-get update
sudo apt-get install libsuitesparse-dev
mkdir ceres-bin
cd ceres-bin
cmake ../ceres-solver-1.14.0
make -j3
make test
# Optionally install Ceres, it can also be exported using CMake which
# allows Ceres to be used without requiring installation, see the documentation
# for the EXPORT_BUILD_DIR option for more information.
make install
Android Studio 3.4.1:需要配置CMake, LLDB, ndk(在SDK Tools中点击安装)
官方Android指南
来源一:官方网站
原文
下载版本高于r9d的Android NDK版本,在jni目录下使用ndk-build进行编译,你会得到libceres.a。
解释
具体使用方法:
cd ceres-solver-1.14.0/jni
EIGEN_PATH=/path/to/eigen/header ndk-build
随后libceres.a便会出现在ceres-solver-1.14.0/obj/local/${ABI}目录下。
${ABI}的值通过修改Application.mk中的APP_ABI := arm64-v8a一行,可.以换armeabi-7va, x86_64等等。
至于动态库(*.so)的生成,根据网上的一些教程进行修改Android.mk和Application.mk,都无法正常编译,官方GitHub里的issue中对于这些报错,建议使用CMake进行编译。
[NOTE] 如果从GitHub上clone的版本是不带jni目录的,只能使用CMake进行编译。
来源二:代码内的文档
原文
编译需要使用NDK r15或者更高版本。
需要使用CMake寻找NDK当中的toolchain来替换本身的自带toolchain。假设你已经设置了变量$NDK_DIR,你可以使用如下命令编译:
cmake \
-DCMAKE_TOOLCHAIN_FILE=\
$NDK_DIR/build/cmake/android.toolchain.cmake \
-DEIGEN_INCLUDE_DIR=/path/to/eigen/header \
-DANDROID_ABI=armeabi-v7a \
-DANDROID_STL=c++_shared \
-DANDROID_NATIVE_API_LEVEL=android-24 \
-DBUILD_SHARED_LIBS=ON \
-DMINIGLOG=ON \
<PATH_TO_CERES_SOURCE>
你可以为各种安卓STL或ABI进行编译,但是最推荐使用c++_shared STL和armeabi-v7a(对于32位机)或arm64-v8a(对于64位机) ABI。许多API的版本都可以进行支持,但是推荐使用你安卓项目所支持的最高版本。
对于你的安卓项目和Ceres二进制文件,你需要使用相同的API版本和STL进行编译。
编译完成之后,你会得到一份libceres.so的库,你可以在编译的脚本中通过使用PREBUILT_SHARED_LIBRARY将它链接到你的安卓项目当中。
如果你正在编译Ceres的例子,想要验证你的库能否使,你需要将他们和libceres.so放在安卓设备上一个可执行的公共目录下(比如/data/local/tmp),并且确保NDK的STL也在同一个目录下。
需要注意的是,所有的求解器或者其他被你包含在项目中的共享依赖项,都需要出现在你安卓的编译配置和你的测试目录当中。
解释
最好采用CMake编译这种方法,后面解释如何修改这个命令。
编译命令
参考资料:https://github.com/qiu-yongheng/cerestest
根据官方材料和参考资料得出如下命令:
rm -rf CMake*
/path/to/sdk/cmake/[version]/bin/cmake \
-DCMAKE_TOOLCHAIN_FILE=/path/to/sdk/ndk-bundle/build/cmake/android.toolchain.cmake \
-DEIGEN_INCLUDE_DIR=/path/to/eigen/header \
-DANDROID_ABI=[ABI]] \
-DANDROID_STL=[c++_shared | c++_static] \
-DANDROID_NATIVE_API_LEVEL=android-24 \
-DBUILD_SHARED_LIBS=ON \
-DMINIGLOG=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="-s" \
-DCMAKE_C_FLAGS=-std=c99 -Os -fvisibility=hidden \
/path/to/ceres
make clean
make
make install
执行如上命令后,首先会遇到如下错误:undefined reference to '__android_log_write'
解决方法:打开[ceres]/internal/ceres/minglog/glog/logging.h,搜索__android_log_write,将带有这个函数的几行注释掉。
重新编译,最后会报错误:'libc++_shared.so' no found
解决方法:这个错误无关紧要,可以看到当前目录下的lib目录已经生成了我们想要的库文件。从ndk-bundle中复制我们所需要的该文件到安卓项目中即可,该文件目录可能是ndk-bundle/sources/cxx-stl/llvm-libc++/libs/[ABI]。无需继续进行编译。
[NOTE] /path/to/eigen/header这个地址,不能使用安装eigen时候放置到的比如/usr/include地址,否则编译的时候会出现冲突,应该直接使用下载解压后的位置。
[NOTE] 每次cmake后,重新编译需要提前先删除当前目录下的CMakeFiles, CMakeCache等中间文件,否则CMake的配置不会发生改变。
测试结果

Android平台使用Ceres Solver的更多相关文章
- Ceres Solver for android
最近开发中,需要对图片做一些处理与线性技术,这时就用到了Ceres Solver.如何把Ceres Solver集成到Android里呢? 官网给了一个解决方案,简洁明了: Downloa ...
- [译]:Xamarin.Android平台功能——位置服务
返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...
- Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!
从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...
- (转)android平台phonegap框架实现原理
(原文)http://blog.csdn.net/wuruixn/article/details/7405175 android平台phonegap框架实现原理 分类: Android2012-03- ...
- Android平台免Root无侵入AOP框架Dexposed使用详解
Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...
- 基于android平台的斗地主AI
本软件是基于android平台的斗地主AI,我们在源代码的基础之上,旨在改进AI的算法,使玩家具有更丰富的体验感,让NPC可以更为智能. (一)玩法解析: (1)发牌和叫牌:一副扑克54张,先为每个人 ...
- 4412开发板Android教程——Android平台简介
本文转自迅为开发板论坛:http://www.topeetboard.com Android和IOS Android的历史 Android公司 2005年Google收购成立22个月的Android公 ...
- Android平台的开发环境的发展演变
因为之前学习java语言的时候安装过了eclipse,所以想在eclipse上搭建android平台,在参照知乎上大神们的意见,发现了AS强大的代码提示.实时预览和搜索匹配等出色功能,最后还是选择在A ...
随机推荐
- spring boot 2.0 thymeleaf调试时正常,打包后运行报错. 找不到模板文件.
使用th:fragment 定义模板 使用 th:replace 来添加模板到需要的地方. 使用时发现一个非常奇怪的问题. 本机idea 调试环境一切正常, 但是打成jar包以后报错,提示找不到对 ...
- c语言:链表
1.链表概述: 链表是一种数据结构,它采用动态分配存储单元方式.它能够有效地节省存储空间(同数组比较). 由于链表中的节点是一个结构体类型,并且结点中有一个成员用于指向下一个结点.所以定义作为结点的格 ...
- 使用NLog记录业务日志到数据库
项目中很多时候要记录业务日志,其实是可以直接用日志框架计入数据库的. 使用NLog并不是只能将日志主体插入数据库,而是可以根据实际情况自定义任意列记入.非常方便.而且很容易实现 下面是用NLog记录业 ...
- POJ 3155:Hard Life(最大密度子图)
题目链接 题意 给出n个人,和m对有冲突的人.要裁掉一些人,使得冲突率最高,冲突率为存在的冲突数/人数. 思路 题意可以转化为,求出一些边,使得|E|/|V|最大,这种分数规划叫做最大密度子图. 学习 ...
- HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***
题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...
- Git使用小技巧之Stash命令藏储零乱分支
想要获取更多文章可以访问我的博客 - 代码无止境. 在开发的过程中可能会经常出现下面这种情况,我们正在开发某个功能,当前分支的内容比较乱,不太适合提交,而此时我们需要切换到其他分支上处理一些事情.这 ...
- 西门子S7-1200与 G120系列变频器USS通信
西门子S7-1200 紧凑型PLC在当前的市场中有着广泛的应用,作为经常与SINAMICS G120系列变频器共同使用的PLC,其USS通信协议的使用一直在市场上有着非常广泛的应用.本文将主要介绍如何 ...
- 【风哥干货】快速解决Oracle数据库故障必备的20个脚本与命令
1.操作系统性能(通常故障出现时最先检查的内容)top.topas.vmstat.iostat.free.nmon 2.万能重启方法 如应急情况,需要重启数据库:tail -100f <对应路径 ...
- C程序中文标点惹的祸,你可长点儿心吧
想必你在编程时,即使写了一个很小很简短的程序,本以为编译一定不会有问题,自信满满,结果编译完了,编译器 给了几个大大的error,比如:error C2018: unknown character'0 ...
- Zeppelin0.5.6使用spark解释器
Zeppelin为0.5.6 Zeppelin默认自带本地spark,可以不依赖任何集群,下载bin包,解压安装就可以使用. 使用其他的spark集群在yarn模式下. 配置: vi zeppelin ...