概述
本文参考:http://blog.csdn.net/martin20150405/article/details/54692386
我将要移植的ORB SLAM算法是一种基于Eigen/ g2o/ DBoW2/ OpenCV外部库,在VS上通过C++11编写的算法。
相对于参考文的方法,我要实现在工程中只添加算法本身的cpp代码,不添加相关库的.cpp/.h代码,即只添加.a/.so文件。
鉴于我上篇文章已实现了将OpenCV算法移植到Android端,剩下的难点将包括以下3部分:
1、Eigen/ g2o/ DBoW2等外部库的移植;
2、.jpg/ .yaml/ .txt等初始化读取;
3、C++算法程序为适应Jni进行的改写。
接下来分别解决这3个部分。
1、外部库移植
要移植Eigen/ g2o/ DBoW2这三个库,因为g2o使用了Eigen,而DBoW2使用了OpenCV,故应先移植Eigen。首先回顾一下openCV是怎么移植到Android上去的。
回顾分析opencv
opencv官方网址:https://opencv.org/releases.html
官网上专门提供了Andorid的安装包,不过那主要是为了在Andorid上通过java编写opencv,速度比较慢。要想速度快,就必须用native (C++)编写。打开 …\OpenCV-android-sdk\sdk\native\libs\arm64-v8a,可以看到其为native方法准备的库。
其中.a文件时静态库,.so文件是动态库,一般的,用动态库的apk,体积小但运行速度慢;用静态库的apk,体积大但运行速度快。
在CMakeList.txt文件中有以下句子:
....
set(OpenCV_DIR D:/OpenCV/cv33/opencv-3.3.0-android-sdk/OpenCV-android-sdk/sdk/native/jni)
find_package(OpenCV REQUIRED)
....
在D:/OpenCV/cv33/opencv-3.3.0-android-sdk/OpenCV-android-sdk/sdk/native/jni路径下的文件中有OpenCVConfig.cmake、“include”、“abi-${ANDROID_NDK_ABI_NAME}”这三个文件/文件夹,
分别表示CMake的编译方式、include头文件、链接的库文件。所以我估计,
其他外部库添加到android NDK端使用都可以在CMakeList文件中组织:a/ include 本地电脑上的头文件;b/ 链接.a/ .so库文件。
Eigen移植
Eigen官方网址:http://eigen.tuxfamily.org/index.php?title=Main_Page
参考:http://blog.csdn.net/u010154424/article/details/50975711
去官网、及相应博客上观看可知,Eigen只有.h头文件,可以在任何平台使用(包括Android)。故只需要在CMakeList添加
即可。
include_directories(“Eigen本地电脑的安装目录”)
由于Eigen中可能用到C++11语言,需要在app的build.gradle中添加
android{
...
defaultConfig{
...
externalNativeBuild{
cmake{
cppFlags "-frtti -fexceptions -std=c++11"
}
}
}
}
g2o移植
g2o官方网址: https://github.com/RainerKuemmerle/g2o
可以看到下载的g2o库都是源码,需要你再本地CMake编译相关的库。因为在其路径下有g2o/script/android.toolchain.cmake,所以可以通过Cmake控制台输入
mkdir build
cd build
cmake -G