Android NDK 環境搭建 + 測試例程

  懶得廢話一大堆概念,關於ADT、NDK的概念要是你不懂,怎麼會搜到這裏來?因此你只須要根據下面的步驟來,就能夠完成NDK環境搭建了。java

  步驟:(假設你未安裝任何相關開發工具,若是已經安裝了,就能夠跳過)android

一. 環境搭建windows

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.jarapp

  能夠打開 cmd 後 輸入:java -version 檢查到底安裝成功沒。eclipse

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-r9dide

  保證在打開 cmd 後,輸入 ndk-build 顯示以下提示。函數

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

 

二. TestNDK開發工具

1. 創建新的安卓工程:TestNDK
嚮導在建立應用的時候 默認的包 前綴是 com.example ,不必更改。因此最後的包名爲:com.example.testndk
建立一個啓動Activity,就叫 TestNDK (非要叫MainActivity的話,後面記得更改)
ps: 我建立的時候,選擇建立Activity結果沒有反應,只能建立一個java文件。這時記得在 AndroidManifest.xml 裏面的application標籤下加上:ui

 <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徹底手冊》寫的比較詳細。

相關文章
相關標籤/搜索