網頁

2013年7月17日 星期三

Android NDK 的使用時機及安裝

1. Android NDK 的使用時機:

        Android , 運行 C/C++ 的程式碼.

        Android 提供的環境¸ 主要是 Java. 相對於 C/C++ 來說, Java 的程式碼並不是 CPU 的指令, 而是 Virtual Machine 的指令. Virtual Machine 是一個軟體模擬的 CPU, 執行 Java 編譯過的虛擬指令. 概念和 System Programming 常用的 Pseudo code 例子是相同的. 或者說 Java 就是 Pseudo code 的一個實例也不為過.

        相較於 C/C++ 而言, 執行 Java 的程式碼, 會多一個步驟. Java 的指令是虛擬的, 因此需要做軟體解碼, 或是轉譯的階段, 才能變成 CPU 的指令. C/C++ 編譯之後, 則是變成真正的 CPU指令. (這邊忽略組譯的部份, 只是說明一下概念). 很顯然, Java 的程式和執行, 無論再怎麼優化, 效率都不可能和 C/C++ 相同或是超越. 頂多只能達到接近.

        其次, C/C++ 佔據了軟體開發歷史的最主要階段. 現在的作業系統幾乎都是 C/C++ 寫成的. 因此如果已存在的 C/C++程式碼, 能夠在 Android 上運行, 那麼對 Android 的功能性也會有大幅的增加.

        因為 C/C++ 編譯的結果是真正的 CPU指令, 所以相對於 Java 而言, 它可以說是原生的, 這也是為什麼稱為 NDK (Native Development Kit) 的原因.
 
        NDK 提供的, 是一個 Java 程式, 去呼叫 C/C++ 的函式的通道. 簡單的說, NDK 的輸出是一個 Linux 上的 shared library. 以及呼叫這個 library 的方法.


2. Install NDK


        原本使用 NDK, 需要 Cygwin, 以及一些在 Linux 開發的 tool chain, 新版的 Android SDK/ADT/NDK 已經不需要再安裝這些東西. 只要確定以上這些 Android 提供的工具的版本, 就可以了. 網路上找的資料, 大部份都已經過時, 甚至連 NDK document 都還沒有完全更新. 以下這個連結的資料可以參考:
http://software.intel.com/en-us/articles/using-the-android-x86-ndk-with-eclipse-and-porting-an-ndk-sample-app
(這個連結主要是說明使用 NDK 在 X86 的系統上, NDK 會需要在 X86 的系統上跑, 幾乎都是在 PC 上跑模擬, 偵錯用. 所以設定會額外多一些, 不過目前, 2013/07/18 之後, 這些設定說不定也不需要了)
 
        接下來說明我實際操作的過程.

        1. 更新 SDK
        以系統管理員開啟 Android SDK Manager, 然後選擇 Install, Android SDK Manager 會自動檢查更新. 更新之後, 重新開啟 Eclipse, 會發現需要 update. 就繼續更新. 重啟.

        2. 下載 Android NDK
        在以下連結下載所需要的 NDK zip . 我是用 android-ndk-r8e-windows-x86_64 這個檔案. 下載完之後, 解到任一目錄. 注意路徑中不要含有空白字元. 在搜尋安裝方法過程中, 有看到過這樣的問題, 但是沒有特別去看到底是什麼問題, 反正多一事不如少一事. 就避免一下.
http://developer.android.com/tools/sdk/ndk/index.html#Downloads
 

        3. 確認 ADT 的版本. Eclipse/Help/About Eclipse 點選 Android 小綠人的圖示, 可以看到 ADT 的版本. 我目前的版本是 22.0.1.v201305230001--685705
 
 

        4. 設定 NDK 的路徑
        Eclipse/Window/Preference/Android/NDK NDK Location 指向前述 NDK 解壓縮之後的路徑.
 
 
 
 

        5. 測試安裝的結果

        5-a, NDK 的目錄裡面有包含了一些 sample, 可以用來測試安裝是否成功.
        Eclipse/File/New/Project/Android, 選擇Android Project from Existing Code.
        Root Directory指向 NDK 的路徑下的 samples/hello-jni, 選取 "copy projects into workspace". 然後按 finish, 參考截圖

       


  

        5-b, 昨天測試的時候, project (com.example.llojni.HelloJni) 上按右鍵, 會出現 Android Tools/Add Native Support 的選項, 不過今天卻找不到 Add Native Support 的選項. 花了不少時間檢查. 後來直接執行, 其實就已經可以了. 不需要再做其他設定.

        6. 結果就是, NDK 的發展環境, 和整合的環境, 已經有大幅度的修改, 需要設定的東西, 已經很少了. 只要 SDK 更新, 下載 NDK, 並且把 Eclipse/Window/Preference/Android/NDK NDK Location指向解壓縮之後的 NDK 路徑, 就可以了. 早期的 Cygwin, Awk, ..., 甚至連 Add Native Support 都不需要了.
 
        Ubuntu 現在也在做手機的作業系統, 主要的論點就是可以直接執行 C/C++ 的 code, 如果只是這樣, 看不出來要如何和 Android 競爭, Android 現在整合 C/C++ 的 code, 也已經很簡單了.