Visual Studio + android + opencv 跨平臺生成動態庫文件

最近需要給安卓平臺的應用程序提供c++開發的算法庫,c++又用到了opencv開源庫,不想使用Android Studio,用慣了VS,因此,寫下VS跨平臺開發安卓動態庫的配置步驟。

 

參考鏈接:https://answers.opencv.org/question/179297/how-to-build-opencv-for-android-using-visual-studio/

https://blog.csdn.net/luoyu510183/article/details/94590497

 

官方說明文檔(用於跨平臺移動開發的 Visual C++):https://docs.microsoft.com/zh-cn/visualstudio/cross-platform/visual-cpp-for-cross-platform-mobile-development?view=vs-2017

(使用 C++ 安裝跨平臺移動開發)https://docs.microsoft.com/zh-cn/visualstudio/cross-platform/install-visual-cpp-for-cross-platform-mobile-development?view=vs-2017

 

 

第一步更改VS

選擇更多-修改-工作負載-移動與遊戲-使用c++的移動開發

選擇安裝,等待安裝完成。

 

第二步配置VS:Setting up Visual Studio

  1. Create a new Visual Studio Project from "Visual C++/Cross Platform/Android" and choose the type of Project you want.
  2. Add the path "Path_to_build_folder/install/sdk/native/jni/include" to "Additional Include directories" and both the "native/3rdparty/libs/armeabi-v7a/" and "native/libs/armeabi-v7a/" to "Additional Library Directories".
  3. In your projects property dialog change "Enable C++ Exceptions" to "Yes (-fexceptions)" under "C/C++ - Code Generation" and "Enable Run-Time Type Information" to "Yes (-frtti)" as well. You can find it under "C/C++ - Language". Also add "-std=c++11" as Additional Option in the Command Line Section of "C/C++".
  4. In the Linker section of your property page, add "-lm -lz" to the command line additional options. This ensures correct linking.
  5. Under "Linker/Input", add all your built modules and also the 3rdparty libs as "Library Dependencies". Important: Only their names, e.g. not "libopencv_core.a", but "opencv_core". The linker will figure out the rest by itself. Now comes my favourite part: As UNIX-style linkers always scan libraries from right to left, the order in which you add the libraries matters. Now you have two options: Either play around with the order of the libraries until you figure out the correct one, or (as found by me after searching for literally hours), just go to your OpenCV build directory and search for the file "OpenCV.mk". In there the line "OPENCV_MODULES" indicates the correct order of the modules. The 3rdparty libraries have to be added after the modules in the Library Dependencies field.

 

第三步,調用例子

1.新建項目-c++-跨平臺-android,選擇Dynamaic Shared Library(Android)

2. In "Solution platform" :Change "Debug x86" to "Release ARM".

3. Follow FERNman's answer do step 2,3,4. By the way,i don't have "libs" dir,use "staticlibs" dir replace.

4. Under "Linker/Input",Be careful of "Library Dependencies",the lib file is made up of three parts:"lib"+"name"+".a",there only need "name":e.g.Transform "libopencv_world.a" into "opencv_world" manually and type it on "Library Dependencies"

 

編譯後,出錯(原因是沒有區分清楚庫依賴項和附加依賴項):

1>------ 已啓動全部重新生成: 項目: SharedObject, 配置: Release ARM ------

1>ANDROID_HOME=C:\ProgramData\Microsoft\AndroidSDK\25

1>ANT_HOME=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Apps\apache-ant-1.9.3

1>JAVA_HOME=C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25

1>NDK_ROOT=C:\\Microsoft\AndroidNDK64\android-ndk-r15c

1>pch.h

1>SharedObject.cpp

1>clang.exe: error: no such file or directory: 'opencv_dnn'

1>clang.exe: error: no such file or directory: 'opencv_highgui'

1>clang.exe: error: no such file or directory: 'opencv_ml'

1>clang.exe: error: no such file or directory: 'opencv_objdetect'

1>clang.exe: error: no such file or directory: 'opencv_photo'

1>clang.exe: error: no such file or directory: 'opencv_stitching'

1>clang.exe: error: no such file or directory: 'opencv_video'

1>clang.exe: error: no such file or directory: 'opencv_calib3d'

1>clang.exe: error: no such file or directory: 'opencv_features2d'

1>clang.exe: error: no such file or directory: 'opencv_flann'

1>clang.exe: error: no such file or directory: 'opencv_videoio'

1>clang.exe: error: no such file or directory: 'opencv_imgcodecs'

1>clang.exe: error: no such file or directory: 'opencv_imgproc'

1>clang.exe: error: no such file or directory: 'opencv_core'

1>clang.exe: error: no such file or directory: 'cpufeatures'

1>clang.exe: error: no such file or directory: 'IlmImf'

1>clang.exe: error: no such file or directory: 'ittnotify'

1>clang.exe: error: no such file or directory: 'libjasper'

1>clang.exe: error: no such file or directory: 'libjpeg-turbo'

1>clang.exe: error: no such file or directory: 'libpng'

1>clang.exe: error: no such file or directory: 'libprotobuf'

1>clang.exe: error: no such file or directory: 'tiff'

1>clang.exe: error: no such file or directory: 'webp'

1>clang.exe: error: no such file or directory: 'quirc'

1>clang.exe: error: no such file or directory: 'tbb'

1>clang.exe: error: no such file or directory: 'tegra_hal'

1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Application Type\Android\3.0\Android.Common.targets(104,5): error MSB6006: “clang.exe”已退出,代碼爲 1。

1>已完成生成項目“SharedObject.vcxproj”的操作 - 失敗。

 

參考資料:https://blog.csdn.net/rrrfff/article/details/51112230

工具-選項-跨平臺,修改sdk,ndk等相關地址

 

又出錯:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Clang.targets(152,5): error MSB6006: “clang.exe”已退出,代碼爲 5。

VS2017無解,改用VS2019 不配置opencv-android-sdk時,編譯OK

 

給VS2019配置opencv-android-sdk, 編譯出錯:

>NDK_ROOT=F:\android\android-ndk-r16-beta1

clang.exe: error: no such file or directory: 'opencv_dnn'

...

Android.Common.targets(119,5): error MSB6006: “clang.exe”已退出,代碼爲 1。

解決方法:

>NDK_ROOT=F:\android\android-ndk-r10e

出錯:

>TRACKER : ���� TRK0005: δ���ҵ�: ��clang.exe����ϵͳ�Ҳ���ָ�����ļ���

Microsoft.Cpp.Clang.targets(154,5): error MSB6006: “clang.exe”已退出,代碼爲 5。

 

經過探索,VS2019 c++-跨平臺-android的Dynamaic Shared Library(Android)按照以下步驟配置,可以編譯通過:

1. 工具-選項-跨平臺,修改sdk,ndk等相關地址

NDK_ROOT=F:\android\android-ndk-r16-beta1

2. 解決方案——屬性——配置屬性——常規:

平臺工具集:Clang5.0

目標API級別:android-19 ----> android21 opencv相關函數才能調用成功

具體可以參考我的下一篇文章:VS跨平臺編譯安卓動態庫

https://mp.csdn.net/postedit/102517851

STL的使用:LLVM libc++ 靜態庫(c++_static)

3. 解決方案——右擊——限定此範圍

4. 編譯,成功

5. 配置opencv-android-sdk靜態庫,除附加依賴項外,其他照常配置,編譯,成功

6. 添加庫依賴項,編譯,成功

opencv_dnn

opencv_highgui

opencv_ml

opencv_objdetect

opencv_photo

opencv_stitching

opencv_video

opencv_calib3d

opencv_features2d

opencv_flann

opencv_videoio

opencv_imgcodecs

opencv_imgproc

opencv_core

cpufeatures

IlmImf

ittnotify

libjasper

libjpeg-turbo

libpng

libprotobuf

libtiff

libwebp

quirc

tbb

tegra_hal

或者修改附加依賴項:

相對地址方式,編譯,成功

-lopencv_dnn

-lopencv_highgui

-lopencv_ml

-lopencv_objdetect

-lopencv_photo

-lopencv_stitching

-lopencv_video

-lopencv_calib3d

-lopencv_features2d

-lopencv_flann

-lopencv_videoio

-lopencv_imgcodecs

-lopencv_imgproc

-lopencv_core

-lcpufeatures

-lIlmImf

-littnotify

-llibjasper

-llibjpeg-turbo

-llibpng

-llibprotobuf

-llibtiff

-llibwebp

-lquirc

-ltbb

-ltegra_hal

絕對地址方式,編譯成功

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_dnn.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_highgui.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_ml.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_objdetect.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_photo.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_stitching.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_video.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_calib3d.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_features2d.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_flann.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_videoio.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_imgcodecs.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_imgproc.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs\armeabi-v7a\libopencv_core.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libcpufeatures.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libIlmImf.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libittnotify.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibjasper.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibjpeg-turbo.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibpng.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibprotobuf.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibtiff.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibwebp.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libquirc.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libtbb.a

E:\opencv-4.1.1-android-sdk\OpenCV-android-sdk\sdk\native\3rdparty\libs\armeabi-v7a\libtegra_hal.a

 

 

 

 

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