古詩詞大全網 - 藝術簽名 - AndroidNDK開發簡介NDK和SDK以及JNI有什麽關系_安卓ndk是幹嘛的

AndroidNDK開發簡介NDK和SDK以及JNI有什麽關系_安卓ndk是幹嘛的

NDK:AndroidNDK是在SDK前面又加上了“原生”二字,即NativeDevelopmentKit,因此又被Google稱為“NDK”。

NDK全稱:NativeDevelopmentKit。

NDK是壹系列工具的集合。

*NDK提供了壹系列的工具,幫助開發者快速開發C(或C)的動態庫,並能自動將so和java應用壹起打包成apk。這些工具對開發者的幫助是巨大的。

*NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平臺、ABI等差異,開發人員只需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創建出so。

*NDK可以自動地將so和Java應用壹起打包,極大地減輕了開發人員的打包工作。

其實:

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

AndroidSDK:

SDK(softwaredevelopmentkit)軟件開發工具包。被軟件開發工程師用於為特定的軟件包、軟件框架、硬件平臺、操作系統等建立應用軟件的開發工具的集合。因此!AndroidSDk指的既是Android專屬的軟件開發工具包

JNI:

JavaNativeInterface(JNI)標準是java平臺的壹部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI是本地編程接口,它使得在Java虛擬機(VM)內部運行的Java代碼能夠與用其它編程語言(如C、C和匯編語言)編寫的應用程序和庫進行交互操作

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

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

代碼1:

classHelloWorld{

publicnativevoid();

static{

System.loadLibrary("hello");

}

publicstaticvoidmain(String[]args){

newHelloWorld().();

}

}

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

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

這裏壹般是以static塊進行加載的。同時需要註意的是System.loadLibrary()的參數“hello”是動態庫的名字。

2)編譯

javacHelloWorld.java

3)生成擴展名為h的頭文件javah?

JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*,jobject);

這個h文件相當於我們在java裏面的接口,這裏聲明了壹個Java_HelloWorld_(JNIEnv*,jobject)方法,然後在我們的本地方法裏面實現這個方法,也就是說我們在編寫C/C程序的時候所使用的方法名必須和這裏的壹致)。

4)編寫本地方法實現和由javah命令生成的頭文件裏面聲明的方法名相同的方法

代碼2:

#include"jni.h"

#include"HelloWorld.h"

#includeotherheaders

JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*env,jobjectobj)

{

printf("Helloworld!/n");

return;

}

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

5)生成動態庫

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

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