Android NDK 環境搭建 + 測試常式

來源:互聯網
上載者:User

  懶得廢話一大堆概念,關於ADT、NDK的概念要是你不懂,怎麼會搜到這裡來?所以你只需要根據下面的步驟來,就可以完成NDK環境搭建了。

  步驟:(假設你未安裝任何相關開發工具,如果已經安裝了,就可以跳過)

一. 環境搭建

1. 安裝 jdk 
   安裝完畢後配置好環境變數(我安裝的是jdk1.7)
    JAVA_HOME = C:\Java\jdk1.7.0_51
    PATH = C:\Java\jdk1.7.0_51\bin
    CLASSPATH = .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar

  可以開啟 cmd 後 輸入:java -version 檢查到底安裝成功沒。

2. 安裝 eclipse 和 adt
  安卓官網已經將adt整合到了eclipse中,之前線上安裝adt的過程簡直是慘不忍睹。
  在安卓官網上下載整合套件,我下載的是 adt-bundle-windows-x86_64-20140624.zip
      我把 這兩個檔案分享在了百度雲端硬碟可以下載:http://pan.baidu.com/s/1kTA4vn5
  下載後建議解壓在 D:\Android 目錄,也可以選擇別的目錄。
  整合套件解壓後在 D:\Android 下將有兩個目錄和一個檔案:
     eclipse  : eclipse 目錄
     sdk   :安卓sdk目錄,裡面只有4.4的包
     SDK Manager.exe : SDK管理器,可以用來下載別的版本的開發包,國內訪問經常被拒絕,繞過的方法可以上網搜。
   
3. 安裝NDK
  在安卓官網上下載 NDK 壓縮包並且解壓。需要注意的是NDK目錄不得有空格,建議依舊解壓到 D:\Android
  我下載的版本是 android-ndk-r9d-windows-x86_64.zip
  r7版本之後可以直接使用ndk-build命令完成編譯,所以不必安裝cygwin環境。
  配置環境變數path:
    在path 中加入 NDK的安裝目錄,比如:D:\Android\android-ndk-r9d

  保證在開啟 cmd 後,輸入 ndk-build 顯示如下提示。

    
 
  而不是找不到 ndk-build 這條命令!

 

二. TestNDK

1. 建立新的安卓工程:TestNDK
嚮導在建立應用的時候 預設的包 首碼是 com.example ,沒必要更改。所以最後的包名為:com.example.testndk
建立一個啟動Activity,就叫 TestNDK (非要叫MainActivity的話,後面記得更改)
ps: 我建立的時候,選擇建立Activity結果沒有反應,只能建立一個java檔案。這時記得在 AndroidManifest.xml 裡面的application標籤下加上:

 <activity             android:name="com.example.testndk.TestNDK"             android:label="@string/app_name" >             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />          、
       </intent-filter> </activity>

 

不管是用嚮導還是直接建立java檔案,最後用下列代碼覆蓋 TestNDK.java 檔案:

 package com.example.testndk; import android.app.Activity;import android.widget.TextView;import android.os.Bundle; public class TestNDK extends Activity{    @Override     public void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         TextView  myTextView = new TextView(this);         myTextView.setText( stringTestNdk() );         setContentView(myTextView);     }      public native String stringTestNdk ();     public native String stringTestNdk2 ();      static {       try{          System.loadLibrary("testNDK");      }catch(UnsatisfiedLinkError ule){          System.err.println("WARNING: Could not load library testndk!");      }   } }

 

2. 產生 .h 標頭檔
  使用eclipse 編譯一下工程,目的是產生相關的的 .class 檔案,因為 動態連結程式庫還未建立,即使安裝到手機上也會崩潰。
        不知道是不是版本的問題,我搜到的教程裡面反正亂七八糟,根本就不對應我的實際情況。
  在我的電腦上,eclipse將產生的class檔案存放在 bin\classes  (相對於工程目錄,後面的操作全部基於根目錄)
  產生 .h 標頭檔的程式是 javah (不瞭解的可以搜尋相關資料看一下)
   在根目錄下啟動命令提示字元(或者開啟命令提示字元切換到根目錄下,取決你的右鍵菜單裡面有沒有開啟命令提示字元)。
     輸入如下命令:
      javah -classpath bin\classes;D:\Android\sdk\platforms\android-20\android.jar -d jni com.example.testndk.TestNDK 
  其中 -classpath 裡面有兩個目錄,一個是前面說的 bin\classes ,根據實際情況更改
  第二個是 安卓的jar包,要是不加上就會報錯,如果你把sdk安裝在別的目錄,就做出相應的更改。如果目錄裡面有空格,就把字串用 "" 包圍。
  -d 指定產生的目錄,即將產生的標頭檔存在在工程目錄下的jni目錄。

  上述命令執行完畢後,jni目錄下增加了一個 :com_example_testndk_TestNDK.h 檔案,內容暫時不用管。

 

3. 編譯產生 so 檔案
  在jni目錄下建立兩個檔案
    第一個是:testNDK.c

 #include <jni.h> #include <string.h> // public native String stringTestNdk (); 方法的c簽名,格式為 Java_包名_類名_方法名 JNIEXPORT jstring JNICALL Java_com_example_testndk_TestNDK_stringTestNdk(JNIEnv *env, jobject this) {     return (*env)->NewStringUTF(env, "Hello,test NDK !"); }

    第二個是:Android.mk

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE    := testNDK LOCAL_SRC_FILES := testNDK.c include $(BUILD_SHARED_LIBRARY)

   儲存後,退回到工程目錄下開啟命令提示字元,執行:ndk-build
  命令執行完畢後,在 libs\armeabi 目錄下應該增加了一個 libtestNDK.so 檔案。

 

4. 安裝apk
  重新編譯運行eclipse,不出意外將會啟動一個程式,顯示: Hello,test NDK !
  如果程式運行奔潰,並且Log處顯示:WARNING: Could not load library testndk!。
  說明載入 共用庫失敗,如果確定代碼沒有變動,就用Winrar開啟 bin目錄下面的 apk檔案,看看 lib/armeabi 裡面有沒有 libtestNDK.so 。 如果沒有,就開啟安卓工程的屬性下的 java bulid path,將 libs/armeabi 加入源路徑,並且重新清理運行。

 

三. 相關說明

1.  我在 TestNDK類中定義了兩個 native 方法,產生的 標頭檔中有這兩個方法的簽名,但是我只實現第一個方法。
  如果你在 程式中調用了 第二個方法就會導致 找不到 native 方法異常。
   要是共用庫載入成功(即沒有顯示 自訂的那個警告)

2.    上述僅實現了一個類中的一個方法,但是 一個 c 檔案裡面是可以包含多個 不同的匯出函數的,所以 使用 javah得到的方法簽名 的實現代碼都可以放在一個 c 檔案裡面。                                (實際上方法簽名也可以自己寫,沒必要非得用 javah)
    要是有多個c檔案產生一個 so,比如 1.c 、2.c ,可以將  LOCAL_SRC_FILES 賦值為:
       LOCAL_SRC_FILES :=  1.c 2.c
 
3.  關於 到底該如何編寫c程式,可以參考教程《JNI完全手冊》寫的比較詳細。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.