Android SDK、NDK、JNI的簡單介紹

來源:互聯網
上載者:User

Android SDK:

SDK (software development kit)軟體開發套件。被軟體開發工程師用於為特定的軟體包、軟體架構、硬體平台、作業系統等建立應用軟體的開發工具的集合。因此。Android SDk 指的既是Android專屬的軟體開發套件

 

JNI:

Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行互動。JNI 是本地編程介面,它使得在 JAVA 虛擬機器 (VM) 內部啟動並執行 Java 代碼能夠與用其它程式設計語言(如 C、C++ 和組合語言)編寫的應用程式和庫進行互動操作

當然一般需要進行如下操作流程:

1) 編寫java程式:這裡以HelloWorld為例。為了實現在 java代碼中調用c函數printf。

  代碼1:

  class HelloWorld {

  public native void testHelloWorld();

  static {

  System.loadLibrary("hello");

  }

  public static void main(String[] args) {

  new HelloWorld().testHelloWorld();

  }

  }

聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。

Load動態庫:System.loadLibrary("hello");

這裡一般是以static塊進行載入的。同時需要注意的是System.loadLibrary()的參數“hello”是動態庫的名字。

2) 編譯

 javac HelloWorld.java

3) 產生副檔名為h的標頭檔 javah ?

 JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld (JNIEnv *, jobject);

 

 這個h檔案相當於我們在java裡面的介面,這裡聲明了一個 Java_HelloWorld_testHelloWorld (JNIEnv *, jobject)方法,然後在我們 的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程式的時候所使用的方法名必須和這裡的一致)。

4) 編寫本地方法實現和由javah命令產生的標頭檔裡面聲明的方法名相同的方法

 

      代碼2:

  #include "jni.h"

  #include "HelloWorld.h"

      #include other headers

 

JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld(JNIEnv *env, jobject obj)

{

    printf("Hello world!/n");

  return;

}

  注意代碼2中的第1行,需要將jni.h(該檔案可以在%JAVA_HOME%/include檔案夾下面找到)檔案引入,因為在程式中的JNIEnv、 jobject等類型都是在該標頭檔中定義的;另外在第2行需要將HelloWorld.h標頭檔引入。然後儲存為 HelloWorldImpl.c就ok了。

5) 產生動態庫

  這裡以在Windows中為例,需要產生dll檔案。在儲存HelloWorldImpl.c檔案夾下面,使用VC的編譯器cl成。 cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:產生的dll檔案名稱在選項-Fe後面配置,這裡是hello,因為在HelloWorld.java檔案中我們loadLibary的時候使用的名字是hello。

另外需要將-I%java_home%/include -I%java_home%/include/win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h檔案。

 

NDK:

NDK全稱:Native Development Kit。
NDK是一系列工具的集合。
* NDK提供了一系列的工具,協助開發人員快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發人員的協助是巨大的。
* NDK整合了交叉編譯器,並提供了相應的mk檔案隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk檔案(指出“哪些檔案需要編譯”、“編譯特性要求”等),就可以建立出so。
* NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。

其實:

NDK就是能夠方便快捷開發.so檔案的工具。JNI的過程比較複雜,產生.so需要大量操作,而NDK就是簡化了這個過程。

打個不恰當比方:JNI 需要自己買菜、洗菜、炒菜、煮飯,很麻煩;NDK就是宅急送,一個電話。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.