Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測

接續前幾篇教學,我們已經建置好 Vuforia 開發及執行環境建立屬於自己的 Image Target、以及把茶壺更換成方塊 ,這邊繼續記錄怎麼使用 Android NDK 來開發,內文有說明為什麼好好的 Android 版本不用卻要用到麻煩的 Android NDK 開發。

2016-07-07 更新:本篇為 3.x 版本,目前 Vuforia 以更新到 5.5.9,新版本使用方式請參考 

馬上解除大家疑問,使用 Android NDK 開發絕對不是自找麻煩,而是小蛙搜遍的各式各樣的教學後得到的答案。

  • 如果你的 APP 希望可以在一個畫面偵測到 1 個以上 Image Target 的話,Android 版本無法做到這項需求
  • 如果你的 3D 模型不是只有正方形、長方形這樣簡單

在 Android 版本無法解決上述兩個問題,因此才需要使用 Android NDK 的方式來開發。Android 版本中如果 3D 模型太複雜,在定義像 Teapot.java 這種檔案的時候會出現「The code of method xxx is exceeding the 65535 bytes limit」錯誤,使用網路上的一些免費模型來測試都沒辦法。

Android NDK 的安裝方式在 Qualcomm Vuforia 教學 (1) – 安裝 Vuforia 有提到 (只是下載以及設定 Eclipse Android NDK 目錄),如果安裝 NDK 有遇到什麼問題,請自行 Google …

先說明 Android NDK 的使用方法,也許有更好的方法,但小蛙找到這種可用的方法就直接用囉!

1. 到 參1 下載 NDK 版本的範例 – ImageTargetsNative-3-0-5.zip

2. 解壓縮檔案,並且依照  Qualcomm Vuforia 教學 (1) – 安裝 Vuforia 提到的方法將專案匯入到 Eclipse,要這邊要注意路徑的問題,如果你的工作目錄有空白一定要避開,像小蛙本來在 Program Files 下,但執行 NDK 時會發生錯誤,因此改成放在 D:\vuforia-sdk-android-3-0-9\samples\ 下。

3. 先執行一次專案看看,發現點了 Start 就出現「java.lang.UnsatisfiedLinkError: Native method not found: com.qualcomm.QCARSamples.ImageTargets.ImageTargets.setActivityPortraitMode:(Z)V」錯誤 …

4. 我們先執行 NDK 編譯出新的 .so 檔案才能繼續使用,開啟「cmd」->以小蛙為例,進到「D:\vuforia-sdk-android-3-0-9\samples\ImageTargetsNative\jni>」,注意 Android.mk 檔案中已經設定了路徑,所以一定要放在 sample 目錄下,或如果對 NDK 熟悉的網友可直接修改

Android.mk D:\vuforia-sdk-android-3-0-9\samples\ImageTargetsNative\jni> ndk-build
[armeabi-v7a] Compile++ arm  : ImageTargetsNative <= ImageTargets.cpp …
[armeabi-v7a] Install        : libVuforia.so => libs/armeabi-v7a/libVuforia.so

5. 整個過程如果沒有出現 Error 就表示編譯成功,回到 Eclipse 的 ImageTargetsNative 專案,重新整理專案後執行

016.png

6. 開啟被封印的能力,多重偵測!開啟 ImageTargetsNative > jni > ImageTargets.cpp,找到

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_onQCARInitializedNative(JNIEnv *, jobject)
 {
     …
 }

把上述「…」部分改成以下內容

// Comment in to enable tracking of up to 2 targets simultaneously and
 // split the work over multiple frames:
 QCAR::setHint(QCAR::HINT_MAX_SIMULTANEOUS_IMAGE_TARGETS, 2);
 // Register the update callback where we handle the data set swap:
 QCAR::registerCallback(&updateCallback);

7. 重複執行第 4 步驟,與第 5 步驟,多重偵測功能正式被開啟!

017.png

參考資料

3 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *