1. android NDK開發簡介 NDK和SDK以及JNI有什麼關系
NDK:Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「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就是簡化了這個過程。
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文件。
2. android ndk是什麼
android是安卓的縮寫,NDK是日本電波工業株式會社的英文縮寫,Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。NDK包括以下方面:
1、從C / C++生成原生代碼庫所需要的工具和build files。
2、將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
3、支持所有未來Android平台的一系列原生系統頭文件和庫。
(2)安卓原生開發用什麼編譯器擴展閱讀:
NDK的產品優勢:
1、NDK擁有培育人工水晶的豐富經驗。而好的人工水晶決定了優質晶振產品的一半的品質。
2、NDK晶振產品尺寸、規格全面,既可滿足中小型、超小型電子元器件的要求,也適用於各類規格要求的細分市場。
3、NDK晶體諧振器、晶體振盪器具有非常優越的頻率一致性和穩定性。特別在汽車電子市場,即使在嚴峻的寬溫(-40度到150度)和震動撞擊環境下,都能保持良好的穩定性。
參考資料來源:網路:NDK
3. Android NDK 用C語言好還是C++好
C++好,對於NDK來說,C++比C語言在與JAVA的回調機制上更加很好的配合,目前來說,大部分比較高級的程序都是利用C++來寫的,既能具備JAVA的方便又能具備C語言的執行效率高,用C++好一些
Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
眾所周知,Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。
NDK包括了:
從C / C++生成原生代碼庫所需要的工具和build files。
將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
支持所有未來Android平台的一些列原生系統頭文件和庫
為何要用到NDK?
概括來說主要分為以下幾種情況:
1. 代碼的保護,由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2. 在NDK中調用第三方C/C++庫,因為大部分的開源庫都是用C/C++代碼編寫的。
3. 便於移植,用C/C++寫的庫可以方便在其他的嵌入式平台上再次使用。