核心定義
- JNI (Java Native Interface):Java 語言規範的一部分,定義 Java 與本地代碼 (C/C++/Assembly) 交互的標準接口,**與平台無關**,PC 端 Java 應用同樣使用 JNI(如讀寫 Windows 注冊表)。
- NDK (Native Development Kit):Google 發布的 **Android 專用** 開發工具包,包含交叉編譯工具鏈、C/C++ 頭文件/庫 (libc, libm, liblog 等)、構建腳本 (ndk-build/CMake)、打包工具,**幫助將 .so 打包進 .apk**。
關係圖解
Java/Kotlin 代碼
│ JNI 調用
▼
本地 C/C++ 實現 (.so)
│ NDK 提供工具鏈、構建系統、打包
▼
APK 安裝包 (lib/armeabi-v7a/*.so)
關鍵區別對比
| 維度 | JNI | NDK |
| 屬性 | Java 平台標準接口 | Android 開發工具包 |
| 平台 | 跨平台 (Windows/Linux/macOS/Android...) | 僅 Android |
| 核心功能 | 定義調用約定、類型映射、JNIEnv API | 提供交叉編譯器、構建腳本、Android 專用庫、APK 打包 |
| 開發流程 | 手動編寫 .c/.h、編譯 .so、配置加載路徑 | ndk-build/CMake 自動化編譯鏈接打包,Android Studio 集成 |
| 可用庫 | 系統庫、任意第三方庫 | 僅 NDK 暴露的 API (libc, liblog, OpenGL ES, OpenSL ES 等),受限 |
| 純 C/C++ 應用 | 不支持(需 Java 宿主) | NDK r5+ 支持 NativeActivity,無需 Java 代碼入口(但仍運行在 VM 上) |
常見誤區澄清
- 「Android 上用 NDK 就不需要 JNI」 → 錯。NDK 內部正是通過 JNI 實現 Java 與 .so 交互,開發者仍需編寫 JNI 函數簽名。
- 「JNI 是 Android 特有」 → 錯。JNI 是 Java SE 標準,PC 端大量使用。
- 「NDK 只提供編譯器」 → 不全面。NDK 關鍵價值在於**構建系統自動化**和**APK 打包集成**,否則手動管理 .so 複製、架構適配極其繁瑣。
開發建議
- Android 初學者:先精通 Java/Kotlin + Android SDK,再學習 JNI 基礎,最後接觸 NDK。
- 性能敏感模塊(圖像處理、加密、物理引擎)優先考慮 NDK + C/C++。
- 需使用 Android 系統隱藏 API (如
utils/Log.h) 時,僅能通過 NDK 內部頭文件訪問,標準 JNI 無法直接調用。