文章目錄
- Android高級開發JNI開發第一篇(初級入門篇)
- 🧠 一、什么是 JNI?
- ? 為什么要用 JNI?
- ?? 二、開發環境準備
- 開發工具
- 🚀 三、創建一個支持 JNI 的 Android 項目
- 第一步:創建新項目
- 項目結構示例
- 🧪 四、第一個 JNI 示例:Hello from C++
- 🧩 Java 代碼(MainActivity.java)
- 五、配置 CMake 構建腳本
- 六、JNI 名稱規則總結
- 七、常見問題排查
- 參考資源
Android高級開發JNI開發第一篇(初級入門篇)
👨?💻 本文作者:一位正在攻克底層開發的 Android 工程師
🧭 目標讀者:有 Java/Android 基礎,希望入門 JNI 開發的新手
📌 本文特點:從零開始,手把手實戰,代碼詳細注釋,適合 CSDN 初學者收藏
🧠 一、什么是 JNI?
JNI(Java Native Interface) 是 Java 提供的一種機制,它允許 Java 代碼與使用 C 或 C++ 編寫的本地代碼進行交互。
簡單說,JNI 是 Java 和原生代碼之間的“翻譯官”。
? 為什么要用 JNI?
使用場景 | 示例 |
---|---|
調用高性能庫 | OpenCV、FFmpeg |
調用底層系統接口 | 系統級音視頻處理、傳感器操作 |
提升性能 | 密集計算場景用 C/C++ |
兼容老舊庫 | 有些廠商 SDK 只提供 .so 文件 |
?? 二、開發環境準備
開發工具
- ? Android Studio(建議 4.0+)
- ? 已配置好 SDK 和 NDK(NDK 安裝可通過 SDK Manager 添加)
- ? 熟悉 Java 基礎語法
🚀 三、創建一個支持 JNI 的 Android 項目
第一步:創建新項目
- 打開 Android Studio,點擊
File > New Project
- 選擇模板:Native C++
- 輸入項目名,比如:
JniHello
- 語言選 Java,C++ 標準選
C++11
- 完成后你會獲得一個默認支持 JNI 的項目結構
項目結構示例
app/
├── src/main/java/com/example/jni/MainActivity.java
├── src/main/cpp/native-lib.cpp
├── CMakeLists.txt
🧪 四、第一個 JNI 示例:Hello from C++
系統自動生成了第一個 JNI 示例,我們來逐步分析它。
🧩 Java 代碼(MainActivity.java)
public class MainActivity extends AppCompatActivity {// 加載本地庫static {System.loadLibrary("native-lib");}// 聲明 native 方法public native String stringFromJNI();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI()); // 調用 native 方法}
}
🧩 C++ 代碼(native-lib.cpp)
#include <jni.h>
#include <string>extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_jni_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}
🔍 分析解釋:
extern “C”:關閉 C++ 的名稱重整(name mangling)
JNIEXPORT/JNICALL:JNI 的標準函數導出宏
Java_全限定類名_方法名:這個函數名必須完全匹配 Java 中聲明的 native 方法
JNIEnv* env:提供訪問 Java 方法、類、對象的能力
NewStringUTF:創建一個 Java 的 String 返回給 Java 層
默認生成的 CMakeLists.txt 一般如下:
五、配置 CMake 構建腳本
cmake_minimum_required(VERSION 3.4.1)add_library(native-libSHAREDnative-lib.cpp )find_library(log-liblog )target_link_libraries(native-lib${log-lib} )
確保你的 app目錄下的 build.gradle 中已啟用 externalNativeBuild:
externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"}
}
最后會輸出為
Hello from C++
? 說明你的 Java 成功調用了 C++ 函數,JNI 配置無誤!
六、JNI 名稱規則總結
Java 代碼 native 函數名
com.example.jni.MainActivity.stringFromJNI() Java_com_example_jni_MainActivity_stringFromJNI
📌 小貼士:包名中的 . 替換為 _,類名與方法名直接拼接。
七、常見問題排查
問題 原因 解決方案
Java 找不到 native 方法 函數名寫錯或拼寫不一致 檢查方法命名和包名是否完全匹配
native 方法未加載 沒有調用 System.loadLibrary() 加上正確的庫名加載語句
編譯報錯:找不到頭文件 NDK 未正確配置 檢查 NDK 安裝路徑或重裝
🧱 下一篇預告:第二篇 - JNI 參數傳遞與 Java → C → Java 雙向調用
敬請期待!
參考資源
- Android NDK 官方文檔
- JNI 規范
- Android JNI 提示