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

2016-07-07 更新:本篇為 3.x 版本,目前 Vuforia 以更新到 5.5.9,新版本使用方式請參考 
Android Vuforia with jPCT-AE (1) – 基本範例
Android Vuforia with jPCT-AE (2) – 載入 obj 測試
Android Vuforia with jPCT-AE (3) – 載入 md2 測試

Android Vuforia with jPCT-AE (4) – 載入 3ds 測試
Android Vuforia with jPCT-AE (5) – 多重模型載入
馬上解除大家疑問,使用 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

 
Vuforia 系列文章:

  1. Qualcomm Vuforia 教學 (1) – 安裝 Vuforia
  2. Qualcomm Vuforia 教學 (2) – Create Image Target
  3. Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本
  4. Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測
  5. Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本
  6. Qualcomm Vuforia 教學 (6) – 3D model -> .obj -> .h

 
參考資料:

  1. Image Targets – C++ @ Vuforia Developer Portal
    https://developer.vuforia.com/resources/sample-apps/image-targets-c
  2. Detecting and Tracking Multiple Targets Simultaneously @ Vuforia Developer Portal
    https://developer.vuforia.com/resources/dev-guide/detecting-and-tracking-multiple-targets-simultaneously

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

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *