前面两篇文章,分别介绍了如何编译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的动态库:
链接器——输入——库依赖项:m
2. 在SharedObject19.cpp中添加测试函数
extern "C" {
省略。。。
float math_test()
{
float t = sqrtf(12.f);//使用math.h中的数学函数
return t;
}
}
3. nm -D ***.so 查看so文件的导出符号
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级别
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文件夹下修改一些内容。
修改步骤:
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即图像文件的名称