mac下編譯vuforia UVCCameraDriver過程記錄
vuforia 安卓版sdk本身不支援usb攝像頭,但是提供了使用usb攝像頭作為資料來源的方法,也就是需要自定義USBCamearDriver。參考 ofollow,noindex">官方文件說明 ,經過一系列掙扎終於算是在mac上調通了,此處做一個步驟記錄。構建自定義USBCamearDriver步驟如下。
1.構建條件
官方文件的Prerequisites部分說的已經很詳細了,當初沒有仔細看這部分,出錯了一度懷疑是mac自帶的python2.7版本過低或者cmake版本過低,浪費了不少時間。
- Android手機
- Python 2 or later
- mac終端
- CMake 3.6 or greater
- Ninja build system ( https://ninja-build.org )
- Android NDK 13b,且只能是13b版本
- Android SDK with API level 22 support
- UVCCamera開源專案原始碼, https://github.com/ptc-shunt/UVCCamera
- Vuforia Android Sdk, https://developer.vuforia.com/downloads/sdk
- Vuforia UVCDriver Sample, https://developer.vuforia.com/downloads/samples
- vuforia-samples-core-android用於測試UVCCameraDriver, https://developer.vuforia.com/downloads/samples
2.構建環境搭建
由於我的mac自帶python2.7版本並已經安裝了android sdk,故我只安裝了cmake、ninja、ndk
1.cmake
第一步:安裝Homebrew ,需要ruby
ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
第二步:安裝cmake, 在Terminal中輸入:
brew install cmake
然後回車,即可
2.ninja
在安裝了homebrew之後,在終端輸入即可安裝
brew install ninja
3.ndk
下載解壓ndk13b,並把ndk-build新增到環境變數中(如果環境變數已經存在不同版本的ndk,則需要暫時修改替換為ndk13b的路徑),注意環境變數名字必須為 ANDROID_NDK_HOME
,不然會在執行python build.py時報錯說沒有定義 ANDROID_NDK_HOME
。
3.開始構建
1.構建 UVCCamera
vuforia UVCDriver對UVC相機操作是基於UVCCamera專案的,且需要引用uvcCamera專案的標頭檔案,故需要下載該專案原始碼。
編譯UVCCamera分成兩個步驟進行
a.解壓 Vuforia Engine for Android到任意目錄,假設此處目錄為VuforiaSDK,解壓下載的UVC Driver Sample到/VuforiaSDK/samples資料夾下,重新命名專案名字為UVCDriver,將下載的UVCCamera工程解壓縮到UVCDriver資料夾下,重新命名專案名為UVCCamera
b.開啟mac終端cd到UVCCamera/libuvccamera/src/main/jni路徑下,輸入ndk-build即可完成UVCCamera專案構建。
注意.因Vuforia UVCDriver Sample的build.py中限定了路徑名稱,所以專案名稱必須為UVCCamera,且位於 VuforiaSDK/samples/UVCDriver目錄下。
2.構建UVCDriver
切換到 VuforiaSDK/samples/UVCDriver
路徑下,
python build.py
如果一切順利,根據官方文件此處應該會在 UVCDriver/build/bin
下生成各個平臺對應的.so檔案。
但是我再構建過程中遇到了 UVCExternalCamera.cpp 983行的uvc_get_format_descs函式未宣告 的錯誤。經過艱難的查詢,發現了該函式在在 UVCCamera/libuvccamera/src/main/jni/libuvc/src/device.c
中是有具體的實現的,而device.c中 #include "libuvc/libuvc.h"
所以我在libuvc/libuvc.h中添加了該方法宣告,如下圖所示。

libuvc.h新增缺失的函式宣告
新增完宣告之後可以再執行 python build.py
,應該就沒有錯誤了,如果還有相同的錯誤,可以嘗試刪除一下build裡的快取或者重新Build一下UVCCamera專案再試
最終的檔案目錄結構如下,其中UVCDriver/build/bin/Android/下是最終構建成功後輸出的庫(此處我只生成了armeabi-v7a的),也是UVCCameraDriver全部的庫檔案。

構建UVCDriver目錄結構
4.使用UVCCameraDriver
從官網下載 vuforia-samples-core-android 並解壓到VuforiaSDK/samples目錄下,使用Anroid Studio開啟專案,將上述UVCDriver/build/bin/Android的armeabi-v7a的資料夾裡的內容拷貝到VuforiaSDK/build/lib資料夾下,同時把sdk中帶的Vuforia.jar和上述構建生成UVCDriver.jar新增到專案依賴中,並在專案中配置好認證的key。在入口Activity處(只要在Vuforia::init()呼叫之前即可)呼叫
Vuforia.setDriverLibrary("libUVCDriver.so");
指明採用的Driver。然後偶run官方demo,連上usb攝像頭到手機上,預設的攝像頭就神器的成了USB攝像頭。官方文件說當前支援兩種配置的攝像頭,但是實際測試是,"無名"的USB攝像頭也可以使用,但第一次開啟demo的時候點選完授權USB裝置使用後,會開在"菊花轉"介面,殺掉App重新啟動,發現可以正常開啟usb攝像頭了。看了一下Driver的java部分的邏輯,可能是DemoDriver的處理不妥當導致的,這個bug沒準可以嘗試修改UVCDriver的原始碼來解決。
官方完檔支援的兩種usb攝像頭配置:
- Logitech HD Webcam c310
- Microsoft LifeCam Studio
最後,合影留念一下。

倔強的水壺