前言
本篇是应一个读者的请求,而且这种需求应该还是蛮多的:刚入职或者刚进实验室的新人,接手一套C++算法工程,现在老板让你移植到Android上。全部用Java重写,当然是不现实的。本文将介绍一种尽可能简单的移植方法。
本文使用的软件版本如下:
- VisualStudio 2019 16.3.5
- AndroidStudio 3.5
- NDK-r16B
- Android SDK 21
- Opencv 4.1.1(android & windows)
准备测试用的OpencvWindows项目
首先请参考 VS2017的C++开发心得(八)DLL动态链接——Opencv的使用建立一个简单的OpenCV VS解决方案,如下:
一个简单的cv::sum的使用。
开始进行安卓端的移植
1. 先创建一个VS的C++安卓.so项目,参考VS2019 C++的跨平台开发——Android .so开发
2. 一些基本的移植概念
所谓的移植,就是移除过去OpenCV对于Windows底层的依赖。
一听到Windows的底层依赖,你是不是感觉自己都是用的C++的标准库在编程,没有用到任何Windows的接口,应该不会有任何依赖。举个一个简单例子,比如你的项目在使用Opencvxxx.dll的时候,会用到LoadLibrary这个函数,而这个函数就是由Windows的user32.dll实现的。
在有全部源码的情况下可以使用安卓的NDK进行重新编译源码,然后要把所有使用的第三方库文件.dll和.lib,替换为安卓端的.so和.a。
3.使用NDK进行项目编译
第一种老实的做法,在步骤1.中建立的安卓项目下面把所有的.cpp和.h文件按照原来的项目结构拷贝过去。
第二种取巧的做法,直接修改“Opencv411Template.vcxproj”和“Opencv411Template.sln”为安卓项目。
(第三种不推荐的做法,在AndroidStudio的JNI中导入所有的.cpp和.h进行编译,用AndroidStudio开发C++实在不推荐)
这里简单介绍第二种做法,尝试之前请备份整个项目。
首先用文本工具打开“Opencv411Template.vcxproj”(准备的Opencv Windows项目)和“SharedObject7.vcxproj”(步骤1.中建立的安卓项目)。
先看下Windows的项目文件:
上图红色框内的就是需要进行编译的文件。除了这部分其他全部替换为“SharedObject7.vcxproj”(下图)中的内容就行,是不是很简单:
把两个红框标注的内容合并起来,记得还要把 "SharedObject7.cpp" "SharedObject7.h""pch.h" 这三个文件拷贝到Opencv411Template的对应目录下,合并结果如下:
接下来修改.sln文件,用右方的红框内的内容替换到左边:
重新打开Opencv411
前言
本篇是应一个读者的请求,而且这种需求应该还是蛮多的:刚入职或者刚进实验室的新人,接手一套C++算法工程,现在老板让你移植到Android上。全部用Java重写,当然是不现实的。本文将介绍一种尽可能简单的移植方法。
本文使用的软件版本如下:
- VisualStudio 2019 16.3.5
- AndroidStudio 3.5
- NDK-r16B
- Android SDK 21
- Opencv 4.1.1(android & windows)
准备测试用的OpencvWindows项目
首先请参考 VS2017的C++开发心得(八)DLL动态链接——Opencv的使用建立一个简单的OpenCV VS解决方案,如下:
一个简单的cv::sum的使用。
开始进行安卓端的移植
1. 先创建一个VS的C++安卓.so项目,参考VS2019 C++的跨平台开发——Android .so开发
2. 一些基本的移植概念
所谓的移植,就是移除过去OpenCV对于Windows底层的依赖。
一听到Windows的底层依赖,你是不是感觉自己都是用的C++的标准库在编程,没有用到任何Windows的接口,应该不会有任何依赖。举个一个简单例子,比如你的项目在使用Opencvxxx.dll的时候,会用到LoadLibrary这个函数,而这个函数就是由Windows的user32.dll实现的。
在有全部源码的情况下可以使用安卓的NDK进行重新编译源码,然后要把所有使用的第三方库文件.dll和.lib,替换为安卓端的.so和.a。
3.使用NDK进行项目编译
第一种老实的做法,在步骤1.中建立的安卓项目下面把所有的.cpp和.h文件按照原来的项目结构拷贝过去。
第二种取巧的做法,直接修改“Opencv411Template.vcxproj”和“Opencv411Template.sln”为安卓项目。
(第三种不推荐的做法,在AndroidStudio的JNI中导入所有的.cpp和.h进行编译,用AndroidStudio开发C++实在不推荐)
这里简单介绍第二种做法,尝试之前请备份整个项目。
首先用文本工具打开“Opencv411Template.vcxproj”(准备的Opencv Windows项目)和“SharedObject7.vcxproj”(步骤1.中建立的安卓项目)。
先看下Windows的项目文件:
上图红色框内的就是需要进行编译的文件。除了这部分其他全部替换为“SharedObject7.vcxproj”(下图)中的内容就行,是不是很简单:
把两个红框标注的内容合并起来,记得还要把 "SharedObject7.cpp" "SharedObject7.h""pch.h" 这三个文件拷贝到Opencv411Template的对应目录下,合并结果如下:
接下来修改.sln文件,用右方的红框内的内容替换到左边:
重新打开Opencv411