標籤:android style io os 使用 ar java for sp
簡介 《Android C++進階編程——使用NDK》提供了Java原生介面(JNI)的概述、Bionic API、POSIX 線程和通訊端、C++支援、原生圖形和聲音API以及NEON/SIMD最佳化。
本文將記錄主要知識點。
詳解1、深入瞭解Android NDKAndroid NDK不是一個專屬的工具;它是一個包含API、交叉編譯器、連結程式、調試器、構建工具、文檔和執行個體應用程式的綜合工具集。
組件如下:
ARM、x86和MIPS交叉編譯器
構建系統
JAVA原生介面標頭檔
C庫
Math庫
POSIX線程
最小的C++庫
ZLib壓縮庫
動態連結程式庫
Android日誌庫
Android像素緩衝區庫
Android原生應用APIs
OpenGL ES 3D圖形庫
OpenSL ES 原生音頻庫
OpenMAX AL 最小支援
Android NDK結構:
ndk-build 構建系統的起點
ndk-gdb 用GUN調試器調試原生組件
ndk-stack 分析原生組件奔潰時的堆棧追蹤
build 構建系統的所有模組
platforms 支援不同android目標版本的標頭檔和庫檔案
samples 執行個體
sources 共用模組
toolchains 支援不同目標機體繫結構的交叉編譯器
2、用JNI實現與原生代碼通訊JNI是Java程式設計語言功能最強的特徵,它允許Java類的某些方法原生實現,同時讓它們能夠像普通java方法一樣被調用和使用。
參考型別對原生方法是不透明的,它不能直接使用和修改,JNI提供了與這些參考型別密切相關的一組API,這些API通過JNIEnv介面指標提供給原生函數。
JNI支援unicode編碼格式和utf-8編碼格式的字串。
原生NIO在緩衝管理區、大規模網路和檔案I/O及字元集支援方面的效能有所改進,適合和JAVA程式之間傳送大量資料。
JAVA有兩類域:執行個體域和靜態域,JNI提供了訪問該兩類域的方法。
局部引用不能在後續的調用中被緩衝及重用,主要原因是他們的使用到期日僅限於原生方法,一旦原生函數返回,局部引用即被釋放。
全域引用在原生方法的後續調用過程中依然有效,除非它們被原生代碼顯示釋放。
全域引用的另一類型是弱全域引用,與全域引用一樣,弱全域引用在原生方法的後續調用過程中依然有效,與全域引用不同的是,弱全域引用並不阻止潛在的對象被垃圾收回。
只在原生方法執行期間及正在執行原生方法的線程環境下局部引用是有效,局部引用不能在多線程間共用,只有全域引用可以被多個線程共用。
被傳遞給每個原生方法的JNIEnv介面指標在與方法調用相關的線程中也是有效,它不能被其它線程緩衝或使用。
3、日誌、調式及故障處理Android日誌架構是logger的核心模組。
日誌訊息由個部分組成:
Main 主要應用程式的日誌資訊
Event 系統事件
Radio Radio相關的日誌資訊
System 調試時產生的低級系統調式資訊。
預設情況下,JNI函數基本不做錯誤檢查。不過JNI提供了一個擴充的檢測方式(CheckJNI),當啟用該功能時,JavaVM和JNIEnv介面指標切換到函數表,這些函數表在調用實際的實現之前執行擴充錯誤檢查,檢查的問題如下:
企圖分配負數大小的數組
將錯誤的指標或Null指標傳遞給JNI函數
傳遞類名稱時語法錯誤
在臨界區調用jni
給newdirectbyebuffer傳遞錯誤參數
當一個異常掛起時調用jni
用在錯誤的線程中的JNIEnv介面指標
域類型與Set<Type>Field函數不匹配
方法類型與Call<Type>Method函數不匹配
用錯誤的參考型別
錯誤的釋放模式
從原生方法返回不相容類型
無效的utf-8數列傳遞給jni調用
兩種方法診斷記憶體問題:
1、使用lib調式模式
2、使用工具,Valgrind和strace記憶體分析工具
4、原生線程
線程是讓單個進程並發執行多個任務的機制,它是共用同一個父進程的記憶體和資源的輕量級進程,一個進程可以包含多個並發執行的線程。
Android支援Java和原生代碼中的線程。
POSIX線程簡稱Pthreads,是一個線程的POSIX標準。當線程結束,能返回一個結果。
POSIX線程同步機制:互斥鎖、訊號量。
POSIX線程調度策略:SCHED_FIFO、SCHED_RR。
5、Socket 編程
Android是基於Linux核心的,NDK提供的標頭檔基本都是 posix 協議的。
socket是一個串連的終點,它可以被命名和定址以在相同機器或網路中不同機器上的應用程式之間傳輸資料。
通訊分為:連線導向的通訊、面向不需連線的通訊、本地通訊。
6、圖形API、音頻API
Android架構提供了android.graphics.Bitmap類用來在Java代碼中操作和使用bitmap像素緩衝。
Android提供了JNI Graphics API 可以使用原生代碼訪問和操作Bitmap對象的像素緩衝。
Android C++進階編程