最近需要給安卓平臺的應用程序提供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
- Create a new Visual Studio Project from "Visual C++/Cross Platform/Android" and choose the type of Project you want.
- 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".
- 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++".
- In the Linker section of your property page, add "-lm -lz" to the command line additional options. This ensures correct linking.
- 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