Native Development Kit
序論 自Android平台發表以來,許多軟體開發者都關注著是否能以原生程式碼(native code,諸如C與C++語言)實作應用程式的內容,網路上也有許多的心得與技巧被提出。Google為了標準化與簡化一般在Android應用程式中 Java類別與原生程式語言間的開發程序與介面,於2009年6月發佈了Android 1.5 NDK(Native Development Kit,原生開發套件)。
單元介紹
基礎知識 具備JNI概念 具備C跟C++語言基本開發能力 具備Java語言一定基礎 具備Android系統一定概念
目錄 Part I NDK概論 Chapter 1NDK基本介紹 Part II
Part I NDK概論
Chapter 1 NDK介紹 1.1 什麼是NDK 1.2 為何需要NDK 1.3 NDK架構 1.4 NDK應用流程 1.6 版本對照表
1.1什麼是NDK NDK = Native Development Kit 是一個本地程式碼開發套件,透過JNI(Java Native Interface)Java本地介面機制來供Java程式碼調用。 每個Android應用程式都是透過Dalvik虛擬機器執行,由虛擬機器來負責程式所需的資源管理,就像Java程 式是透過Java虛擬機器執行一樣。 Dalvik對於Android應用程式使用原生程式碼的概念也學習自Java。 Dalvik實作了標準的 JNI(Java Native Interface,Java原生介面,Java語言用來與C或C++等原生程式碼溝通的介面)功能, 使Android應用程式中的Java類別能順利的 與原生函式庫溝通。 這些函式庫可能是原本已內建於Android系統中的核心函式庫(如:libc、WebKit、SQLite等),或是由開發者自行撰 寫並編譯完成的函式庫。Android應用程式透過Dalvik虛擬機器的JNI功能與原生函式庫溝通的方式,如圖所示:
1.1什麼是NDK(cont'd) Java Source C Source Compile with Javac Header file Compile and link C code Java Class Create C Header with Javah -jni Dynamic library 這個流程圖是JAVA如何透過JNI來呼叫底層的C/C++函式庫 為什麼要介紹這張圖? 因為NDK的用處就是將自己說定義的C或C++的函示庫包在自己所編寫的APP中所使用 每個寫好的APP最後都會發布成APK為了將自己所撰寫的函示庫可以包在裡面所以需要使用NDK做打包 Java VM Java Class Dynamic lib
1.1 什麼是NDK(cont'd) JNI與NDK差別 JNI是Java調用Native機制 NDK是Google幫助Android開發者透過C/C++本地語言編寫應用程式的開發工具 對內,android內部則用JNI(java native interface)表示java call c 的結構. android 上層用Java,底層用C中間用JNI串接. 對外, google提出NDK發展系統,以串接Java與 C原理都一樣 JNI是Java調用Native機制,是Java語言自己的特性全稱為 Java Native Interface,類似的還有微軟.Net Framework上的p/invoke,可以讓C#或Visual Basic.Net可以調用C/C++的API,所以說JNI和Android沒有關係,在PC上開發Java的應用,如果運行在Windows平台使用 JNI是是經常的,比如說讀寫Windows的註冊表。 NDK是Google公司推出的幫助Android開發者透過C/C++本地語言編寫應用程式的開發工具,包含了C/C++ 的header文件、library文件、說明文檔和範例程式碼,我們可以理解為Windows Platform SDK一樣,是純C/C++編寫的,但是Android並不支持純C/C++編寫的應用,同時NDK提供的library和fuction功能很有限,僅僅處理些算法效率敏感的問題
1.2為何需要NDK NDK是一系列工具的集合 NDK帶來什麼 幫助開發者快速開發C(或C++)的動態庫 自動將so和Java應用程式一起打包成apk NDK集成了交叉編譯器 NDK帶來什麼 使用C開發,性能需求較高的邏輯程式,提高應用程式的執行效率。 使用C開發,需保密的應用邏輯程式。 NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。 NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。 它可產生Linux,OS X 和windows(用Cygwin)上的原生ARM 的二進制碼。 NDK就是能夠方便快捷開發.so檔案的工具。JNI的過程比較複雜,生成.so需要大量操作,而NDK就是簡化了這個過程。
1.2為何需要NDK(cont’d) 提供了一套穩定,保證在以後的版本支持所有的平台的原生API libc (C library) headers libm (math library) headers JNI interface headers libz (Zlib compression) headers liblog (Android logging) header OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers libjnigraphics (Pixel buffer access) header (for Android 2.2 and above). A Minimal set of headers for C++ support OpenSL ES native audio libraries Android native application APIS
1.3NDK架構 Android Manifest,Dalvik Classes(Java程式碼),資源檔和JNI調用的本地函式庫(.so檔)。 一般藉由NDK打包成的apk內容包含了 Android manifest 以及 Dalvik classes Resource bundle Libraries JNI等內容
Linux kernel + Android extensions 1.3NDK架構(cont'd) Android NDK Apps SDK Apps Android app frameword Standard library Linux kernel + Android extensions JNI Native code Dalvik runtime
1.4NDK應用流程 Android * NDK Application Dalvik Application 這是創建本地的動態函示庫與JAVA JNI的流程以及關係圖 1. Create the Java class representing the native code 2. Create the native code header file 3. Implement the native code by writing your C code 4. Compile everything and build you Shared Library 5. Use your native code inside Android activity
1.5開發步驟 NDK應用的開發流程主要分為五個步驟: 1、 創建本地程式碼 2、 編寫makefile檔案,mk檔案 3、 編譯本地程式碼為library檔案(so) 4、 從Java端調用本地程式碼 5、 用gdb來測試本地程式碼
1.5開發步驟(cont'd) 應用程式調用流程如圖所示:Android App透過Java Framework調用Java SDK API, 透過JNI調用本地library檔案。
1.5開發步驟(cont'd) 在Android專案下的jni文件夾下面創建本例中使用的本地程式碼hello-jni.c 以及Android.mk,程式碼如圖所示。 注意,在Android.mk文件中要添加X86的支持項。
1.5開發步驟(cont'd) 進入專案所在目錄,執行ndk-build來編譯本地程式碼,執行效果如下次,會分別為ARM和X86生成相對應的so檔案,從java調用本地程式碼如圖紅色標出所示。
1.5開發步驟(cont'd) 測試流程的要求以及測試過程如下圖,需要注意的是在manifest文件中需要設置android:debuggable=“true”; 然後使用ndk-gdb來測試即可。
1.6版本對照表 API Level SDK NDK API Level 3 Android 1.5 NDK 1 API Level 4
練習 NDK是什麼? 為什麼需要NDK ? NDK開發有哪幾個步驟 1. NDK是Google公司推出的幫助Android開發者透過C/C++本地語言編寫應用程式的開發工具,包含了C/C++ 的header文件、library文件、說明文檔和範例程式碼,我們可以理解為Windows Platform SDK一樣,是純C/C++編寫的,但是Android並不支持純C/C++編寫的應用,同時NDK提供的library和fuction功能很有限,僅僅處理些算法效率敏感的問題 2. NDK是一系列工具的集合 幫助開發者快速開發C(或C++)的動態庫 自動將so和Java應用程式一起打包成apk NDK集成了交叉編譯器 NDK帶來什麼 使用C開發,性能需求較高的邏輯程式,提高應用程式的執行效率。 使用C開發,需保密的應用邏輯程式。 3. 1、 創建本地程式碼 2、 編寫makefile檔案,mk檔案 3、 編譯本地程式碼為library檔案(so) 4、 從Java端調用本地程式碼 5、 用gdb來測試本地程式碼