948
京東網上商城
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組件。
最後更新:2017-04-03 12:53:49