2012年6月29日 星期五

新版第一支Android程式(Android SDK r20) -- HelloWorld 包含 NDK Plugin


每年的Google I/O大會都會帶一些新的震撼出來,今年也不例外除了Android 4.1(Jelly Bean,果凍糖),Nexus 7,Nexus Q..外最主要因應Android 4.1在SDK Tools部分發佈了r20版本,由於初次使用感覺上跟以前的操作介面改變了許多故在部落格上整理分享一下。



在SDK 及ATD 安裝或升級部分與以往大同小異,SDK/ADT除了支援4.1及修正了一些Big外,還提升一些功能例如Tracer for GLES、Lint、Layout Editor、XML Editing並整合了NDK插件詳見:
SDK 及 ADT 官方網站說明。

接著,新增一個HelloWorld看看改變了多少:
1.SDK部分
首先File -->NEW-->Andoid Application Project 會看到New Android Application畫面,在Application Name 輸入HelloWorld後會自動帶入其他欄位相關資訊。

如上圖如果遇到三角形內有驚嘆號是建議修改符號,用滑鼠點一下該欄位下方就會出現相關資訊。
如果再專案要建立自己專屬的啟動圖示只要將Create custom launcher icon (預設打勾)
然後確認Create Project in Workspace是否有打勾(預設打勾),按下Next

接著我們會看到新的功能就是建立專屬的啟動圖示,這裡可以使用圖片、預設圖檔以及文字,不過這裡需要注意一下我使用了文字的部分似乎專案建立會失敗,這裡我不識很清楚是我的環境問題還是ADT問題,如果有解的話我會在更新這部分說明。( 新版本ADT 20.0.1已改)
Trim surrounding blank space預設是打勾,主要是平滑圖形用。
Additional Padding如果百分比越大圖示裡面的前景圖會越小。
圖示中在Shap有無背景(None)、方形(Square)及圓形(Circle)三種方式

決定後按下Next會來到Create Activity畫面,這裡有兩種Activity可選用,差別在於手機及平板。

選擇MasterDetaiFlow的話在第一頁的Minimum Required SDK要選擇Android 3.0(API 11)的項目。
按下Next後接著是New Blank Activity畫面,修正好相關資訊按下Finish就會產生出HelloWorld專案了。

從上面eclipse畫面可以看到新版的Layout Editor,上方有一個AppTheme可以更換程式的畫面,這裡就留給各位去試試了。
執行結果:

上圖可以看到我所設計的啟動圖示(HelloWorld)。

2.NDK插件部分
===========07/06補充========================================
在Windows平台上使用時:
1.安裝部分由於Eclipse CDT需要用到Cygwin中的sh及make,新版支援了NDK內建的gcc(arm-linux-androideabi-gcc-4.4.3),所以確定還是要安裝Cygwin。(感謝Steve Lin提問)
註:Eclipse CDT會自動在找x:\Cygwin\bin目錄中的sh及make來使用。
2.Eclipse CDT安裝的部分參考"在 Ubuntu 12.04 LTS 安裝 Android SDK&NDK 開發環境"這篇文章。 (補充:CDT在ATD安裝NDK Plugin時會一併安裝)
===========================================================

至於整合NDK Plugin部分,首先設定NDK所在位置用滑鼠選擇 Windows --> Preference --> Android -->NDK 用 Broese選擇 Android NDK 路徑:

點選 OK後,在專案名稱上按下滑鼠右鍵-->Android Toold --> Add Native Support

輸入Library Name後按下Finish就會在專案下自動產生jni目錄,目錄下同時產生Android,mk及hello.jni.cpp
(注意這裡是cpp檔,所以程式記得要寫JNI_OnLoad函式,不然會出現 No JNI_OnLoad found in .... ,見 Java Native Interface (JNI) Android C++語言篇--以Hello-JNI為例)


接著參照 "Java Native Interface (JNI) Android C++語言篇--以Hello-JNI為例 " 這篇文章寫出hellojni的程式後,用滑鼠選擇專案名稱後再選擇 File-->Properties 會看到 Properties for 專案名稱 的畫面,接著選擇 C/C++ General  --> Path and Symbols -->Include --> Add 這時會出現Add directory path -->File System... -->
這時候選擇路徑:
C:\android-ndk-r8\platforms\android-14\arch-arm\usr\include

NDK所在目錄\platforms\android-14\arch-arm\usr\include

按下Apply --> OK ,這個部分主要是解決如下圖所示的問題

此時,用滑鼠在專案名稱按下右鍵 --> Run As --> Android Applicatio 就會看到 console開始編譯 jni 然後模擬器就會跑出結果


後記,新版的SDK已經包含了NDK插件,所以如果是windowns平台上再也不用安裝cygwin ,在可以自動用NDK所帶的GCC編譯C,環境建置上就簡化不少了。
至於其他Debug工具及Layout編輯部分,有機會再測試一下囉。

參考:
1. Android SDK
http://developer.android.com/intl/zh-CN/tools/sdk/tools-notes.html

2.Android ADT
http://developer.android.com/intl/zh-CN/tools/sdk/eclipse-adt.html

3.Creating your first Android JNI/NDK Project in Windows Eclipse with Sequoyah
http://permadi.com/blog/2011/09/creating-your-first-android-jnindk-project-in-eclipse-with-sequoyah/

4.Java Native Interface (JNI) Android C++語言篇--以Hello-JNI為例
http://www.cheng-min-i-taiwan.blogspot.tw/2011/08/java-native-interface-jni-android-c.html

===========相關閱讀========================================
在 Ubuntu 12.04 LTS 安裝 Android SDK&NDK 開發環境

16 則留言:

  1. 請教一下照上列步驟會出現下列錯誤, 是否需要安裝cygwin或是少了什麼設定呢?

    **** Build of configuration Default for project AndroidMain ****

    sh D:\Android\android-ndk-r8\ndk-build all

    Error: Cannot run program "sh": Launching failed

    **** Build Finished ****

    回覆刪除
    回覆
    1. Sorry!剛測試一下的確還是會使用到cygwin中的sh及make,文章部份我會修正一下!感謝您的提問。

      刪除
    2. 没有指定ndk的路径windows->preference->android->ndk

      刪除
  2. 您好,我照著NDK 的步驟走 一直都跑出 Hello World 並沒有出現 Hello From JNI!

    有更清楚的NDK 教學嗎? 我已經全部更新到最新版,再回去看舊版的有些東西都不同 實在有點看不懂~

    回覆刪除
    回覆
    1. 1.請參考本部落格中:第一支Android NDK程式--HelloJni
      2.需要你出錯的Log才會知道哪邊沒做到...

      刪除
  3. 您好,我想要問一個問題

    如何讓原本存在的Hello World (置中)
    變成Hello From JNI!(左上) 而不是創造一個新的Text

    原本 setContentView(R.layout.activity_my_ndk);
    希望能直接用這個 把Hello From JNI 取代原本的Hello World

    回覆刪除
    回覆
    1. 只要修改一下程式把傳回來的值送到原先定義好的Text上,HelloJni只是原廠的範例參考參考就可以了。

      刪除
    2. 原本的code 是這樣
      (activity_my_ndk.xml)


      (MyNDK.java)
      ...
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      //setContentView(R.layout.activity_my_ndk);-->想要印在這
      TextView as = new TextView(this);
      as.setText( stringFromJNI());
      setContentView(as);
      }

      目前文字原本在中間,那如何 讓as 這個直接回傳到我預設好的地方

      刪除
    3. 我自己找到解答了XDDD
      setContentView(R.layout.activity_my_ndk);

      TextView test = (TextView) findViewById(R.id.textView1);
      test.setText(stringFromJNI());

      就可以讓Hellojni 顯示在中間的位置(也就是一開始的TextView)

      刪除
  4. 我想請問一下 我照著蚊子大的第一支Android NDK程式--HelloJni 步驟安裝cygwin,cdt,ndk. 可是我在Windows->Preferences->Android裡沒有NDK選項耶...是我哪裡漏掉了嗎??

    回覆刪除
    回覆
    1. 版本問題,請確認ADT版本為r20以後,Eclipse版本在3.6以上才可以裝r20...

      刪除
  5. 我是eclipse 4.2.0, ADT r20.0.3 @@

    回覆刪除
    回覆
    1. 我這邊使用的環境是win7 64bit + java version "1.6.0_35" + Eclipse JUNO + ADT 20.0.3 沒問題,你用再確認一下用Help-->Install New Software --> ADT Plugin -->確認NDK Plugins有沒有裝到... (或者到About Eclipse找找確認!)

      刪除
  6. 我新裝了ndk-plugin後原本cygwin的命令端就開不起來了,說找不到.bash?

    回覆刪除
  7. 我執行後還是有問題
    C:\android-ndk-r8d\ndk-build.cmd all
    C:/android-ndk-r8d/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
    "Compile++ thumb : Hello <= Hello.cpp
    jni/Hello.cpp: In function '_jstring* Java_demo_example_Hello_Hello_stringFromJNI(JNIEnv*, jobject)':
    jni/Hello.cpp:31:18: error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
    make: *** [obj/local/armeabi/objs/Hello/Hello.o] Error 1

    程式我是按照sample裡的hello-jni貼上的 make在Cygwin我是安裝3.81-2 請問我是有哪裡漏掉嘛?

    回覆刪除
    回覆
    1. 檔名如果是cpp有另外一種寫法,你可以參考部落格中另外一篇"....C++語言篇--以Hello-JNI為例"。

      刪除