1. 程式人生 > >【OpenCV3.3】搭建VS2017+Android開發環境

【OpenCV3.3】搭建VS2017+Android開發環境

        在上一篇【OpenCV3.3】編譯原始碼並搭建VS2017+Windows開發環境中我們搭建了OpenCV的Windows開發環境,現在我們來搭建Android的C++開發環境。本文假設讀者的VS2017已經能夠正常編譯出Android程式,使用的NDK版本是r13b (VS2017 15.3內建支援的NDK版本)。

        編譯Android版本OpenCV涉及到交叉編譯,相比Windows複雜得多,為此官方提供了編譯好的靜態庫供開發者使用,首先我們來簡單看看OpenCV SDK如何使用:

  1. 我們首先關注路徑\opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native
    ,可以看到該目錄下的libs3rdparty\libs子目錄裡存放著各CPU架構的靜態庫.a;
    同時我們看到\opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\jni\include目錄裡存放著所需要的標頭檔案。
  2. 上面的幾個目錄分別就是Library和Include需要配置的目錄,在我們的Android專案屬性裡配置好相應路徑就可以了:
        Include目錄: \opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\jni\include
        Library目錄:  \opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\libs\$(TargetArchAbi)\opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\3rdparty\libs\$(TargetArchAbi)
  3. 開啟C++異常(-fexceptions)和執行時型別資訊(-frtti),分別在C++屬性設定的`程式碼生成`和`語言`裡;否則\opencv2\flann\any.h會出現編譯錯誤(個人表示不喜歡any_cast這種依賴於執行時型別資訊和異常的機制)。
  4. Clang/GCC似乎不支援像MSVC那樣直接在原始碼裡指定連結庫(實際上編譯和連結是兩個不相關的過程,在編譯階段影響連結階段也似乎不是很合理),所以在遷移程式碼的時候需要在Linker->Library Dependencies裡新增依賴庫,順便提下這裡和Windows新增依賴庫有一些不同,*nix系統都是如此,指定依賴庫時不需要字首lib也不需要字尾.a或.so,比如你新增liblibpng.a
    libopencv_dnn.a這兩個依賴庫,只需要輸入libpng;opencv_dnn即可,此外.so也是可以被連結的,連結.so就和windows平臺使用.dll一樣,最後執行時動態連結。

        到此為之,不出意外的話我們已經能夠在Android上跑OpenCV的程式了,很簡單不是?但是如果我們要自行編譯OpenCV,比如Github上有新的commits想試試,或者想對原始碼進行微調等等,就不是那麼容易了。這裡首先因為CMake尚不支援生成VS上的Android專案*,其次OpenCV專案太龐大不適合人工生成,所以先暫且放棄使用VS編譯Android版本OpenCV的想法,等哪天實現了再來更新;而通過命令列進行Build的話,官方已經有文件了,寫的也比我好,就不重複了,參考http://code.opencv.org/projects/opencv/wiki/Building_OpenCV4Android_from_trunk

        *ps: 嚴格來講是CMake GUI,筆者嘗試使用cmake和VS遷移一個專案到Android,指定的toolchain file是從https://github.com/taka-no-me/android-cmake獲取的,不過上面的版本幾年不維護了,配合高版本cmake使用會出一些問題,改到最後發現雖然目標是生成Android專案,但是CMake卻依舊去檢測MSVC而不是arm-linux-androideabi工具鏈,方向都錯了不是,果斷棄坑,改換手工生成VS的Android專案,雖然一些config.h項需要手動改,但還算完美。