VS跨平台编译安卓动态库 与 AS中opencv的配置

前面两篇文章,分别介绍了如何编译opencv-android的库文件:

https://blog.csdn.net/Merria28/article/details/102517420

以及在VS的跨平台动态库中如何配置opencv:

https://blog.csdn.net/Merria28/article/details/102517646

 

这一篇简单介绍一下,如何生成纯C++动态库和添加opencv的动态库

我这种搞图像算法的通常借助opencv开源库的一些功能,写成c++算法,两个不在一起搞不行(很多人是在AS中直接调用opencv,我不会用java写算法,只能一步步来了)

 

使用Visual Studio2019新建项目——跨平台——C++——android——动态共享库,生成so文件。

其内部可以直接写c++函数,便于c++代码开发。

 

第一部分: Visual Studio-跨平台编译-android- 动态共享库,生成so文件,供JAVA调用(可以是Android Studio,也可以是Eclipse)

1. 链接其它.so文件

#include //增加math头文件

需要添加math的动态库:

链接器——输入——库依赖项:m

 

2. 在SharedObject19.cpp中添加测试函数

extern "C" {

省略。。。

float math_test()

{

float t = sqrtf(12.f);//使用math.h中的数学函数

return t;

}

}

 

3. nm -D ***.so 查看so文件的导出符号

 

VS跨平台编译安卓动态库 与 AS中opencv的配置_第1张图片

 

4. 验证opencv是否可以正常调用

添加 #include

配置opencv,可参考文章:

Visual Studio + android + opencv 跨平台生成动态库文件https://blog.csdn.net/Merria28/article/details/102517646

 

编译出错(原因是添加了opencv头文件):

错误(活动) E0282 全局范围没有 "acosl" SharedObject19 F:\android\android-ndk-r16-beta1\sources\cxx-stl\llvm-libc++\include\cmath 464

错误(活动) E0282 全局范围没有 "asinl" SharedObject19 F:\android\android-ndk-r16-beta1\sources\cxx-stl\llvm-libc++\include\cmath 465

。。。

后来发现使用VS2019,用自带的sdk,ndk选择android-21,就可以编译通过,原因:

The answer is - NDK version for SDK 19 doesn't implement the whole C++11 standard in the STL. locale.h header has stubs for localeconv() method, but the library doesn't implement it.The closest Android SDK that implement localeconv() is SDK 21.

修改方法:属性——配置属性——常规——目标API级别

VS跨平台编译安卓动态库 与 AS中opencv的配置_第2张图片

 

 

5. 在SharedObject19.cpp中添加opencv相关测试函数

extern "C" {

省略。。。

float math_test()

{

float t = sqrtf(12.f);//使用math.h中的数学函数

return t;

}

float opencv_test()

{

cv::Mat img = cv::imread("D:\\image\\ocrROI.bmp");

cv::Scalar mean, stddev;

cv::meanStdDev(img, mean, stddev);

float t = mean(0);

return t;

}

}

编译通过,生成so文件,可以通过第3步查看导出函数。

 

这部分内容是可以正常生成so文件的,现在回头查看是有问题的:没有提供java可直接调用的接口函数,在android studio中调用时只能通过native c++类型的项目,在native-lib.cpp中再实现java接口,才能成功被调用。具体可参考文章:

终极篇 C++算法到安卓的移植——AS调用VS的so库 https://blog.csdn.net/Merria28/article/details/102745163

 

 

第二部分 Android Studio 调用opencv

这部分内容是直接在AS中调用opencv库的配置。因为用到了就写下来。

参考链接:https://www.jianshu.com/p/9240d1440051

这个作者给出的方法可以完全复现。

这里解释一下,测试部分相关代码添加后,需要在对应的res文件夹下修改一些内容。

 

VS跨平台编译安卓动态库 与 AS中opencv的配置_第3张图片

 

VS跨平台编译安卓动态库 与 AS中opencv的配置_第4张图片

修改步骤:

1. imageView变量

F:\android\AndroidStudioProjects\jianshu-TestOpenCV-master\app\src\main\res\layout\activity_main.xml文件修改,添加如下内容

android:id="@+id/imageView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />

 

2. girl变量

F:\android\AndroidStudioProjects\jianshu-TestOpenCV-master\app\src\main\res\drawable文件夹下

放入girl.gif的图像文件,girl即图像文件的名称

 

 

 

你可能感兴趣的:(android,算法移植)