前面兩篇文章,分別介紹瞭如何編譯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.h> //增加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文件的導出符號
4. 驗證opencv是否可以正常調用
添加 #include <opencv2/opencv.hpp>
配置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文件修改,添加如下內容
<ImageView
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即圖像文件的名稱