jni和ndk詳解
NDK(Native Development Kit)“原生”也就是二進位制
android常用的開發方式是java封裝的庫,而這些庫的底層實現是由C/C++實現,如媒體,圖形庫等
java呼叫這樣實現就需要用JNI(Java Native Interface)
平時用的也就是google給我們封裝的好的庫,即便是底層實現用的不是Java,但都有統一的Java介面
而NDK的作用是“我們自己寫原生程式碼”(C/C++),自己用JNI封裝成Java介面
比如我們想做個計算,二這不是Java的強項,可以用C/C++來寫實現,返回一個運算結果就行了
NDKr5已經實現了不用寫一行Java程式碼開發程式了,只不過還是用到了虛擬機器,細節被封裝隱藏起來了而已
對於JNI和NDK很多Android開發初學者沒有搞明白這個問題
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++的標頭檔案、庫檔案、說明文件和示例 程式碼,我們可以理解為Windows Platform SDK一樣,是純C/C++編寫的,但是Android並不支援純C/C++編寫的應用,同時NDK提供的庫和函式功能很有限,僅僅處理些演算法效率敏感的 問題,所以Android123推薦初學者學好Java後再學習JNI。
NDK其實多了一個把.so和.apk打包的工具,這個是很重要的。
而JNI開發並沒有打包,只是把.so檔案放到檔案系統的特定位置。
如果是做應用開發,則需要NDK工具,不然你開發的應用程式怎麼給使用者用呢?難道幫他重新編譯檔案系統?
其他至於實現,java呼叫本地C/C++函式,及其編寫方式,我覺得JNI和NDK沒有什麼區別。
還有一個我個人理解,NDK開發C/C++只能能使用NDK自帶的有限的標頭檔案,而使用JNI則可以使用檔案系統中帶的標頭檔案,比如utils/Log.h
而後者的資源更多,當然NDK正在努力開發中,以便支援更豐富的介面。
問:NDK 是什麼
1、NDK 是一系列工具的集合。
- NDK提供了一系列的工具,幫助開發者快速開發
C (或
C++ )的動態庫,並能自動將
so 和
java 應用一起打包成
apk 。這些工具對開發者的幫助是巨大的。 - NDK整合了交叉編譯器,並提供了相應的
mk 檔案隔離
CPU 、平臺、
ABI 等差異,開發人員只需要簡單修改
mk 檔案(指出
“ 哪些檔案需要編譯
” 、
“ 編譯特性要求
” 等),就可以建立出
so 。 - NDK可以自動地將
so 和
Java 應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK 提供了一份穩定、功能有限的API標頭檔案宣告。
Google明確宣告該API是穩定的,在後續所有版本中都穩定支援當前釋出的
API。從該版本的
NDK
中看出,這些 API
支援的功能非常有限,包含有: C
標準庫( libc
)、標準數學庫( libm
)、壓縮庫( libz
)、 Log
庫( liblog
)。
問:NDK帶來什麼
1、NDK 的釋出,使“Java+C”的開發方式終於轉正,成為官方支援的開發方式。
- 使用NDK
,我們可以將要求高效能的應用邏輯使用 C
開發,從而提高應用程式的執行效率。 - 使用NDK
,我們可以將需要保密的應用邏輯使用 C
開發。畢竟, Java
包都是可以反編譯的。 - NDK促使專業
so 元件商的出現。(樂觀猜想,要視乎
Android 使用者的數量)
2、NDK 將是Android平臺支援C開發的開端。
NDK提供了的開發工具集合,使開發人員可以便捷地開發、釋出C元件。
相關文章
- Android Studio ndk-Jni開發詳解Android
- 你真的瞭解 NDK 和 jni 的區別嗎
- Android JNI和NDK有什麼區別Android
- NDK 知識梳理(3) JNI 之 Java 和 JNI 資料型別對映Java資料型別
- Android NDK祕籍--初識NDK、JNI、Makefile/CMakeAndroid
- JNI技術詳解
- JNI/NDK開發指南(1):JNI開發流程及HelloWorld
- JNI/NDK開發指南(開山篇)
- Android:清晰講解JNI 與 NDK(含例項教學)Android
- JNI/NDK開發指南(9):JNI呼叫效能測試及優化優化
- Android NDK開發之JNI基礎Android
- JNI/NDK開發指南(4):字串處理字串
- Android Studio ndk-Jni開發詳細入門,Aes加密demoAndroid加密
- Java 本地介面 JNI 使用詳解Java
- Android:JNI 與 NDK到底是什麼?Android
- Mac下安裝NDK,進行JNI開發Mac
- [Android開發]Mac下NDK開發(JNI)AndroidMac
- 【詳解】JNI(Java Native Interface)(一)Java
- 【詳解】JNI (Java Native Interface) (二)Java
- 【詳解】JNI (Java Native Interface) (三)Java
- 【詳解】JNI (Java Native Interface) (四)Java
- JNI/NDK開發指南(8):呼叫構造方法和父類例項方法構造方法
- Android Studio NDK開發-JNI呼叫Java方法AndroidJava
- Android Studio NDK:二、JNI 返回JAVA 實體AndroidJava
- Android NDK開發之旅14 JNI 快取策略Android快取
- Android NDK開發之旅14 JNI 異常處理Android
- Android Studio NDK開發:JNI呼叫Java函式AndroidJava函式
- Eclipse自動編譯NDK/JNI的三種方法Eclipse編譯
- Android NDK開發之旅11 JNI JNI資料型別與方法屬性訪問Android資料型別
- 使用NDK編譯含JNI的Android專案常見問題解決方案編譯Android
- Native開發與JNI機制詳解
- linux下JNI開發步驟詳解Linux
- Android JNI&NDK程式設計小結及建議Android程式設計
- JNI/NDK開發指南(6):C/C++訪問Java例項方法和靜態方法C++Java
- JNI初步(五)jni ndk 一個.so檔案依賴另一個.so檔案的寫法
- Java jvm級別native關鍵詞、JNI詳解JavaJVM
- JNI/NDK開發指南(3):JNI資料型別及與Java資料型別的對映關係資料型別Java
- Android NDK隱藏jni動態庫的內部符號表Android符號