1. 程式人生 > >android NDK開發環境搭建

android NDK開發環境搭建

轉自: http://blog.chinaunix.net/uid-26524139-id-3206370.html

基於 Android NDK 的學習之旅-----環境搭建

工欲善其事必先利其器 , 下面介紹下 Eclipse SDK NDK Cygwin CDT 整合開發環境的搭建。

1、Android 開發環境搭建

Android開發環境搭建不是重點,相信看此文章的很多人都已經搭建成功,這裡隨便概述性的說說。

1) 下載 JDK

2) 下載 Eclipse

3) 下載 Android SDK

4) 啟動Eclipse , 安裝 ADT

2、下載安裝Android NDK

我使用的NDK版本為r5

Google 出的最新NDK 為 r6 下載地址為

3、下載安裝cygwin

由於NDK編譯程式碼時必須要用到make和gcc,所以你必須先搭建一個linux環境, cygwin是一個在windows平臺上執行的unix模擬環境,它對於學習unix/linux操作環境,或者從unix到windows的應用程式移植,非常有用。通過它,你就可以在不安裝linux的情況下使用NDK來編譯C、C++程式碼了。下面我們一步一步的安裝cygwin吧。

(安裝的時候忘記截圖了)

1、 然後雙擊執行吧,執行後你將看到安裝嚮導介面:

2、 點選下一步

此時讓你選擇安裝方式:

1)Install from Internet:直接從Internet上下載並立即安裝(安裝完成後,下載好的安裝檔案並不會被刪除,而是仍然被保留,以便下次再安裝)。

2)Download Without Installing:只是將安裝檔案下載到本地,但暫時不安裝。

3)Install from Local Directory:不下載安裝檔案,直接從本地某個含有安裝檔案的目錄進行安裝。

3、選擇第一項,然後點選下一步:

4、選擇要安裝的目錄,注意,最好不要放到有中文和空格的目錄裡,似乎會造成安裝出問題,其它選項不用變,之後點下一步:

5、上一步是選擇安裝cygwin的目錄,這個是選擇你下載的安裝包所在的目錄,預設是你執行setup.exe的目錄,直接點下一步就可以:

6、此時你共有三種連線方式選擇:

1) Direct Connection:直接連線。

2) Use IE5 Settings:使用IE的連線引數設定進行連線。

3) Use HTTP/FTP Proxy:使用HTTP或FTP代理伺服器進行連線(需要輸入伺服器地址、埠號)。

使用者可根據自己的網路連線的實情情況進行選擇,一般正常情況下,均選擇第一種,也就是直接連線方式。然後再點選“下一步”,

8、 此時會下載載入安裝包列表

9、Search是可以輸入你要下載的包的名稱,能夠快速篩選出你要下載的包。那四個單選按鈕是選擇下邊樹的樣式,預設就行,不用動。View預設是Category,建議改成full顯示全部包再查,省的一些包被隱藏掉。左下角那個複選框是是否隱藏過期包,預設打鉤,不用管它就行,下邊開始下載我們要安裝的包吧,為了避免全部下載,這裡列出了後面開發NDK用得著的包:autoconf2.1、automake1.10、binutils、gcc-core、gcc- g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make共12個包

10、 然後開始選擇安裝這些包吧,點skip,把它變成數字版本格式,要確保Bin項變成叉號,而Src項是原始碼,這個就沒必要選了。

11、 下面測試一下cygwin是不是已經安裝好了。

執行cygwin,在彈出的命令列視窗輸入:cygcheck -c cygwin命令,會打印出當前cygwin的版本和執行狀態,如果status是ok的話,則cygwin執行正常。

然後依次輸入gcc –version,g++ --version,make –version,gdb –version進行測試,如果都打印出版本資訊和一些描述資訊,非常高興的告訴你,你的cygwin安裝完成了!

4、配置NDK環境變數

修改 檔案 C:\cygwin\etc\profile   增加以下內容後以後可以直接使用ndk-build編譯

PATH="/usr/local/bin:/usr/bin:/cygdrive/d/android_sw/android-ndk-r9d:${PATH}"

4、配置NDK環境變數

1、 首先找到cygwin的安裝目錄,找到一個home\<你的使用者名稱>\.bash_profile檔案,我的是:E:\cygwin\home\Administrator\.bash_profile,(注意:我安裝的時候我的home資料夾下面神馬都沒有,解決 的辦法:首先開啟環境變數,把裡面的使用者變數中的HOME變數刪掉,在E:\cygwin\home資料夾下建立名為Administrator的資料夾(是使用者名稱),然後把E:\cygwin\etc\skel\.bash_profile拷貝到該資料夾下)。

2、 開啟bash_profile檔案,新增

NDK=/cygdrive/<你的碟符>/<android ndk 目錄>        例如:NDK=/cygdrive/e/android-ndk-r5
export NDK

記得要在cygwin64命令列執行  

source /cygdrive/d/cygwin64/home/Administrator/.bash_profile

 其中d/cygwin64為我win7的cygwin安裝路徑

NDK這個名字是隨便取的,為了方面以後使用方便,選個簡短的名字,然後儲存

3、開啟cygwin,輸入cd $NDK,如果輸出上面配置的/cygdrive/e/android-ndk-r5資訊,則表明環境變數設定成功了。

5、用NDK來編譯程式

1、 現在我們用安裝好的NDK來編譯一個簡單的程式吧,我們選擇ndk自帶的例子hello-jni,我的位於E:\android-ndk-r5\samples\hello-jni(根據你具體的安裝位置而定),

2、 執行cygwin,輸入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,進入到E:\android-ndk-r5\samples\hello-jni目錄。

3、 輸入$NDK/ndk-build,執行成功後,它會自動生成一個libs目錄,把編譯生成的.so檔案放在裡面。($NDK是呼叫我們之前配置好的環境變數,ndk-build是呼叫ndk的編譯程式)

4、 此時去hello-jni的libs目錄下看有沒有生成的.so檔案,如果有,你的ndk就執行正常啦!

6、在eclipse中整合c/c++開發環境

1、 裝Eclipse的C/C++環境外掛:CDT,這裡選擇線上安裝。

首先登入http://www.eclipse.org/cdt/downloads.php,找到對應你Eclipse版本的CDT外掛的線上安裝地址。

2、 然後點Help選單,找到Install New Software選單

3、 點選Add按鈕,把取的地址填進去,出來外掛列表後,選Select All,然後選擇下一步即可完成安裝

4、 安裝完成後,在eclispe中右擊新建一個專案,如果出現了c/c++專案,則表明你的CDT外掛安裝成功啦!

後面的配置可以不用設定也能使用eclipse開發了。 我有些沒有看懂下面的內容,在此標註一下。

7、配置C/C++的編譯器

1、 開啟eclipse,匯入ndk自帶的hello-jni例子,右鍵單擊專案名稱,點選Properties,彈出配置介面,之後再點選Builders,彈出專案的編譯工具列表,之後點選New,新新增一個編譯器,點選後出現新增介面,選擇Program,點 擊OK

2、出現了新增介面,首先給編譯配置起個名字,如:C_Builder

設定Location為<你cygwin安裝路徑>\bin\bash.exe程式,例如:E:\cygwin\bin\bash.exe,設定WorkingDirectory為<你cygwin安裝路徑>\bin目錄,例如:E:\cygwin\bin

設定Arguments為

--login -c "cd /cygdrive/I/JavaWorkSpace/Blog/NDK_02&& $NDK/ndk-build"

上面的配置中 /cygdrive/I/JavaWorkSpace/Blog/NDK_02是你當前要編譯的程式的目錄,$NDK是之前配置 的ndk的環境變數,這兩個根據你具體的安裝目錄進行配置,其他的不用變,Arguments這串引數實際是 給bash.exe命令列程式傳引數,進入要編譯的程式目錄,然後執行ndk-build編譯程式

3、接著切換到Refresh選項卡,給Refresh resources upon completion打上鉤

4、然後切換到Build Options選項卡,勾選上最後三項

5、之後點選Specify Resources按鈕,選擇資源目錄,勾選你的專案目錄即可

6、 最後點選Finish,點選OK一路把剛才的配置都儲存下來,注意:如果你配置的編譯器在其它編譯器下邊,記得一定要點Up按鈕,把它排到第一位,否則C程式碼的編譯晚於Java程式碼的編譯,會造成你的C程式碼要編譯兩次才能看到最新的修改

7、 這一路下來肯定很累了吧,現在再次恭喜你,編譯配置也配置完成啦,現在來測試一下是否可以自動編譯呢,開啟專案jni目錄裡的hello-jni.c檔案把提示Hello from JNI!改成其他的文字:如:Hello,My name is alex.,然後再模擬器中執行你的程式,如果模擬器中顯示了你最新修改的文字,那麼Congratulations!你已經全部配置成功啦!

下面是google NDK開發例項:

Create a new project in Eclipse from the existing sample source or use the android tool to update the project so it generates a build.xml file that you can use to build the sample.

  • In Eclipse:
    1. Click File > New Android Project...
    2. Select the Create project from existing source radio button.
    3. Select any API level above Android 1.5.
    4. In the Location field, click Browse... and select the <ndk-root>/samples/hello-jni directory.
    5. Click Finish.
  • On the command line:
cd <ndk-root>/samples/hello-jni
<ndk_root>/ndk-build

然後就OK

hello-jni.c 檔案內容:

#include <string.h>
#include <jni.h>


/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI ---  !");
}

注意:

c檔案中,函式名這樣定義:Java_com_example_hellojni_HelloJni_stringFromJNI,有什麼講究麼?這個是JNI的標準,定義需要按照如下格式:

       Java_packagename_classname_methodname

相應對應

package com.example.hellojni;

public class HelloJni extends Activity

       stringFromJNI  為方法名稱

HelloJni.java


package com.example.hellojni;


import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;


public class HelloJni extends Activity
{
  
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);


        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }


    /* A native method that is implemented by the
     * 'hello-jni' native library, which is packaged
     * with this application.
     */
    public native String  stringFromJNI();


    /* This is another native method declaration that is *not*
     * implemented by 'hello-jni'. This is simply to show that
     * you can declare as many native methods in your Java code
     * as you want, their implementation is searched in the
     * currently loaded native libraries only the first time
     * you call them.
     *
     * Trying to call this function will result in a
     * java.lang.UnsatisfiedLinkError exception !
     */
    public native String  unimplementedStringFromJNI();


    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.hellojni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.loadLibrary("hello-jni");
    }
}

cygwin下安裝unzip,經過網上查詢以及求助現在將步驟總結如下:

 2,下載完成後開啟檔案,找到其中有一個unzip552.tar.gz的壓縮檔案,解壓這個檔案就可以了。

   http://linux.softpedia.com/progDownload/UnZip-Download-389.html  直接下載:unzip552.tar.gz

3,把解壓後的檔案放到cygwin一個目錄下。

4,我是放在C:/cygwin/home/wind/unzip-5.52這裡了,unzip-5.52是unzip的目錄

5,然後把unzip-5.52目錄下的unix下的makefile拷貝到unzip-5.52目錄下

6,執行命令make generic

7,執行命令make install