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.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即圖像文件的名稱

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章