2011年7月17日 星期日

Android 開發筆記 - 設定 Windows 之 Android NDK (Native Development Kit) 開發環境

之前的學習環境都是 Ubuntu 桌機為主,無聊在 ASUS Eee PC 1215N - Intel(R) Atom(TM) CPU D525 / 1.80GHz / 4GB RAM / Windows 7 32-bit 上,安裝 Eclipse 和 ADT 後,發現單獨啟動 Android 2.3.3 模擬器竟然只要 5 分鐘左右耶,這真是神奇了!(這個速度對這類裝備已經算很驚奇了),隨後我便開始著手看看在 Windows 使用 Android NDK 的環境了。


關於 NDK 的使用,採用 Cgywin 環境,如此一來就可以透過 ndk-build 進行編譯的動作了。


安裝項目:



  • Java Platform (JDK) - jdk-6u26-windows-i586.exe (76.8MB)

  • Eclipse Classic - eclipse-SDK-3.7-win32.zip (174MB)

  • Android SDK - installer_r12-windows.exe (34.8MB)

  • Android NDK - android-ndk-r6-windows.zip (64.5MB)

  • Cgywin - 安裝完大小約 225MB


    • 來源選 ftp://ftp.ntu.edu.tw (不行再改用 http://ftp.ntu.edu.tw)

    • 安裝項目:


      • 必要項目 Devel 分類:


        • gcc: C compiler upgrade helper

        • gcc-core: C compiler

        • gcc-g++: C++ compiler

        • gcc-mingw-core: Mingw32 support headers and libraries for GCC

        • gcc-mingw-g++: Mingw32 support headers and libraries for GCC C

        • make: The GNU version of the 'make' utility

        • mingw-runtime: MinGW Runtime



      • 非必要:

        • Net > openssh: The OpenSSH server and client programs

        • Editors > vim: ViIMproved - enhanced vi editor

        • Utils > screen: Run separate screens on a single terminal





    • 小問題:

      • 路徑上有空白的問題

      • 以 Eclipse 的 workspace 來說,預設位置是 C:\Users\username\workspace ,但在 cgywin 上也可以從 c:\Documents and Settings\username\workspace 進入,但從後者來說,路徑上有空白將導致 ndk-build 過程會出錯,請避開使用,若使用者帳號有中文或空白的話,那也盡量把 workspace 移去其他地方吧






上述軟體在 Windows 上的安裝路徑:


C:\Program Files\Java
C:\cygwin
C:\eclipse
C:\Android\android-sdk
C:\Android\android-ndk-r6


隨後在 Eclipse 建立一個 Project,此例為 MyNDK:


Project name: MyNDK
Build Target: Android 2.3.3/Android Open Source Project/2.3.3/10
Application name: MyNDK
Package name: com.example.ndk
Create Activity: MyNDK
Min SDK Version: 3


其他細節請參考 Android 開發教學筆記 - 使用 Android NDK (Native Development Kit) ,除此之外要留意該篇文章的軟體版本或路徑是不一樣的,僅供參考。


透過 Cygwin 測試 ndk-build:


user@pc ~
$ cd /cygdrive/c/Users/username/workspace/MyNDK/jni

user@pc /cygdrive/c/Users/username/workspace/MyNDK/jni
$ ls
Android.mk  my-jni.c

user@pc /cygdrive/c/Users/username/workspace/MyNDK/jni
$ cat Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := my-jni
LOCAL_SRC_FILES := my-jni.c
include $(BUILD_SHARED_LIBRARY)

user@pc /cygdrive/c/Users/username/workspace/MyNDK/jni
$ cat my-jni.c
#include <string.h>
#include <jni.h>
jstring Java_com_example_ndk_MyNDK_stringFromJNI( JNIEnv* env, jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from My JNI !");
}

user@pc /cygdrive/c/Users/username/workspace/MyNDK/jni
$ cd ..

user@pc /cygdrive/c/Users/username/workspace/MyNDK
$ /cygdrive/c/Android/android-ndk-r6/ndk-build
Compile thumb  : my-jni <= my-jni.c
SharedLibrary  : libmy-jni.so
Install        : libmy-jni.so => libs/armeabi/libmy-jni.so


接著可以設定 Eclipse 讓它可以自動編譯 JNI 的部分,在 Project > Properties > New > Program :


Location: C:\cygwin\bin\bash.exe
Working Directory: ${workspace_loc:${project_path}} (不設定也行,在此沒用到)
Arguments: --login -c "cd /cygdrive/c/Users/username/workspace/${project_path} && /cygdrive/c/Android/android-ndk-r6/ndk-build"


ndk-build-eclipse-cygwin


別忘了設定 Build options,例如 Run the builder 裡勾選 After a clean / During a manual builds 等,就可以透過 clean 來啟動 ndk build 動作。


如此一來,就可以透過 cgywin 裡頭,透過 vim 編輯器撰寫 jni 的程式部分,也可以在裡面呼叫 ndk-build 來測試,最後再切換到 Eclipse 以便測試整合囉。關於這次的 Windows Android NDK 的使用,原先以為多安裝個 cygwin 很麻煩,但仔細想一下我在 Ubuntu 上的使用,一樣也是透過開啟一個 terminal 去編輯 jni 的部分,那轉換在 Windows 上的動作,其實也沒有比較多。


相關文章:



5 則留言:

  1. 大大:
    我有一些問題想請教你!
    關於 我現在想在android phone 上寫一個 可以同時使用wifi & 3G 傳輸的app
    我在google查到的資料 都說不可能 但也看到有人說 需要更改android kernel
    想請問大大 若我想完成此app是否要安裝android NDK(因為要改kernel)
    還是說 我搞錯NDK用法了 能不能請大大給點意見方向 : )
    目前已安裝 eclipse android SDK 在win7(64bit)

    版主回覆:(09/12/2011 12:31:04 AM)


    hello, 我對這塊不熟,尚未接觸這種領域。

    不過對於說要改 kernel 的部份,我猜應該是指系統 OS 那塊,已經不是一個 android app 的範圍 XDD 等同於要每支手機都要客製化,不是安裝一隻 android app 就能搞定的事。

    基本上我也認為同時使用 wifi 跟 3g 傳輸是有點奇怪的情境,那種感覺就像你在你的 pc 上裝了兩張網路卡,接了兩條網路線,想要同時用兩條網路線上網,這樣的情境在 server 端是存在需求的,但是在 client 端倒有點小怪,同理在 mobile 端(client)就更奇怪啦 Orz

    你可以跟其他人多多討論,或許你只需要偵測現在是用 wifi 還是 3g 傳輸,接著設計你的 android app 的使用情境。此外,這部份我沒有經驗,所以 NDK 能不能幫到你,我就不清楚了 XD

    回覆刪除
  2. 感謝大大熱情回覆 我收到了 : )

    回覆刪除
  3. hello, 謝謝大大的講解: )
    關於改kernel 變成客製化手機的部分 因為小弟有在網路上看到一段資料:使用Android NDK的嵌入式系統開發者能夠順利地穿越應用程式框架以及Dalvik VM所立下的藩籬,自行以C/C++程式語言來發展更底層的原生函式庫。開發者可以在應用程式當中,透過Java原生介面(Java Native Interface, JNI)合法地呼叫使用這些自行發展的原生函式庫。更重要的是,開發者可以將開發好的原生函數庫及應用程式,一併封裝包裏成.apk應用程式封裝檔案,並佈署於嵌入式系統硬體設備當中。 我的理解是 修改kernel的部分也封裝到app裡了 所以不用重刷OS 所以不需要每支手機都客製化 不知道我這樣的理解是否正確 from: http://blog.chinatimes.com/tomsun/archive/2010/09/02/534485.html
    再來是wifi 3G的部分 這個app的一開始的想法就是要盡量使用資源的感覺,所以若可同時使用兩種interface必可加快傳輸速率(當然這之間還有很多packet如何分配傳輸的問題
    不管怎樣 真的感謝大大熱情的回覆!! 還有你的文章的好棒!! 感謝你


    版主回覆:(04/23/2012 08:39:56 AM)


    Hi,

    使用 NDK/JNI 的確可以用到更系統底層的東西,但那都是建立在系統底層有提供相對應的函式庫,因此寫 NDK 時就類似寫 C/C++ 時,可以 include 相關 header 後就可以操作啦。至於同時使用 wifi 跟 3g 網路傳輸的部分,如果這是很一般化的使用,理論上會有對應的函式庫可供使用,但我沒有這一類的經驗來做確認,如果系統預設並沒有提供,那就變成需要寫程式來變更系統底層的設定,這方面多少將會牽扯到系統權限等等的問題,不見得是寫 NDK 就能搞定的事(例如 root your android phone),而且就算成功了,也有可能未來面對 android market 更周詳的審查規格時,把這樣的行為認定不合法,因此不讓你的程式上架。

    因此,如果你是單純的 android app 上層開發者且想要用的 wifi 跟 3g 傳輸的情境是需要更多權限的話,我會建議還是避免這類需要額外權限的實作方式,你會需要 android market 的支持。但倘若你是把玩一整個從系統底層上來的開發者或是非常有興趣搞這類,那的確可以玩看看 :D 青春就該熱血一下嘛

    祝你好運囉!

    回覆刪除
  4. Hi~

    想請教一個問題 當我在測試 cygdrive 時,大部分指令結果都跟大大的一樣,唯獨最後一個指令回報一個錯誤
    「-bash: /cygdrive/android-ndk-r8d/ndk-build: No such file or directory」
    實際檢查過 C:\cygwin\android-ndk-r8d 裡頭確實有 ndk-build 在裡頭

    以下是我各種軟體的安裝路徑
    NDK - C:\cygwin\android-ndk-r8d
    cygdrive - C:\cygdrive
    SDK - C:\Program Files\Android\android-sdk
    JAVA - C:\Program Files\Java
    eclipse - C:\eclipse

    有對照過我使用的 ndk 版本來修改過參考的數字了,但仍就遇到錯誤,懇求大大指點迷津

    回覆刪除
  5. 報告大大,常試過後發現其實我路徑其實還是錯的。
    目前已經測試ndk成功了!!
    謝謝大大的文章,受益良多!

    版主回覆:(04/23/2012 11:02:32 AM)


    恭喜恭喜 :D 看錯誤訊息可能是少了個 c or d 槽,如 /cygdrive/c/android-ndk-r8d/ndk-build

    回覆刪除