Android平台使用Ceres Solver

Android平台使用Ceres Solver,第1张

概述在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(

在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# CMakesudo apt-get install cmake# Google-glog + gflagssudo apt-get install libGoogle-glog-dev# BLAS & LAPACKsudo apt-get install libatlas-base-dev# Eigen3sudo 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-1319687sudo apt-get updatesudo apt-get install libsuitesparse-devmkdir ceres-bincd ceres-bincmake ../ceres-solver-1.14.0make -j3make 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指南 来源一:官方网站 原文

下载版本高于r9dAndroID NDK版本,在jni目录下使用ndk-build进行编译,你会得到libceres.a

解释

具体使用方法:

cd ceres-solver-1.14.0/jniEIGEN_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.mkApplication.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/ceresmake cleanmakemake 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全部内容,希望文章能够帮你解决Android平台使用Ceres Solver所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1123368.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存