Android高級開發第一篇 - JNI(初級入門篇)

文章目錄

  • 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 項目

第一步:創建新項目

  1. 打開 Android Studio,點擊 File > New Project
  2. 選擇模板:Native C++
  3. 輸入項目名,比如:JniHello
  4. 語言選 Java,C++ 標準選 C++11
  5. 完成后你會獲得一個默認支持 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 提示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82934.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch Image Models (timm) 技術指南

timm PyTorch Image Models (timm) 技術指南功能概述 一、引言二、timm 庫概述三、安裝 timm 庫四、模型加載與推理示例4.1 通用推理流程4.2 具體模型示例4.2.1 ResNeXt50-32x4d4.2.2 EfficientNet-V2 Small 模型4.2.3 DeiT-3 large 模型4.2.4 RepViT-M2 模型4.2.5 ResNet-RS-1…

openEuler安裝MySql8(tar包模式)

操作系統版本&#xff1a; openEuler release 22.03 (LTS-SP4) MySql版本&#xff1a; 下載地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 準備安裝&#xff1a; 關閉防火墻&#xff1a; 停止防火墻 #systemctl stop firewalld.service 關閉防火墻 #systemc…

從零開始的數據結構教程(六) 貪心算法

&#x1f36c; 標題一&#xff1a;貪心核心思想——發糖果時的最優分配策略 貪心算法 (Greedy Algorithm) 是一種簡單直觀的算法策略。它在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望得到一個全局最優解。這就像你…

CPP中CAS std::chrono 信號量與Any類的手動實現

前言 CAS&#xff08;Compare and Swap&#xff09; 是一種用于多線程同步的原子指令。它通過比較和交換操作來確保數據的一致性和線程安全性。CAS操作涉及三個操作數&#xff1a;內存位置V、預期值E和新值U。當且僅當內存位置V的值與預期值E相等時&#xff0c;CAS才會將內存位…

Axure設計案例——科技感對比柱狀圖

想讓數據對比展示擺脫平淡無奇&#xff0c;瞬間抓住觀眾的眼球嗎&#xff1f;那就來看看這個Axure設計的科技感對比柱狀圖案例&#xff01;科技感設計風格運用獨特元素打破傳統對比柱狀圖的常規&#xff0c;營造出一種極具沖擊力的視覺氛圍。每一組柱狀體都仿佛是科技戰場上的士…

怒更一波免費聲音克隆和AI配音功能

寶子們&#xff01; 最近咱軟件TransDuck的免費聲音克隆和AI配音功能被大家用爆啦&#xff01;感謝各位自來水瘋狂安利&#xff01;&#xff01; DD這里也是收到好多用戶提的寶貴建議&#xff01;所以&#xff0c;連夜肝了波更新&#xff01; 這次重點更新使用克隆音色進行A…

UDP協議原理與Java編程實戰:無連接通信的奧秘

1.UDP協議核心原理 1. 無連接特性&#xff1a;快速通信的基石 UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是TCP/IP協議族中無連接的輕量級傳輸層協議。與TCP的“三次握手”建立連接不同&#xff0c;UDP通信無需提前建立鏈路&#xff0c;發送…

vue-seamless-scroll 結束從頭開始,加延時后滾動

今天遇到一個大屏需求&#xff1a; 1??初始進入頁面停留5秒&#xff0c;然后開始滾動 2??最后一條數據出現在最后一行時候暫停5秒&#xff0c;然后返回1?? 依次循環&#xff0c;發現vue-seamless-scroll的方法 ScrollEnd是監測最后一條數據消失在第一行才回調&#xff…

[Protobuf] 快速上手:安全高效的序列化指南

標題&#xff1a;[Protobuf] (1)快速上手 水墨不寫bug 文章目錄 一、什么是protobuf&#xff1f;二、protobuf的特點三、使用protobuf的過程&#xff1f;1、定義消息格式&#xff08;.proto文件&#xff09;(1)指定語法版本(2)package 聲明符 2、使用protoc編譯器生成代碼&…

uniapp調用java接口 跨域問題

前言 之前在Windows10本地 調試一個舊項目&#xff0c;手機移動端用的是Uni-app&#xff0c;vue的版本是v2。后端是java spring-boot。運行手機移動端的首頁請求后臺接口老是提示錯誤信息。 錯誤信息如下&#xff1a; Access to XMLHttpRequest at http://localhost:8080/api/…

[ Qt ] | Qlabel使用

目錄 屬性 setTextFormat 插入圖片 設置圖片根據窗口大小實時變化 邊框和對其方式 ?編輯 設置縮進 設置伙伴 Qlabel可以用來顯式圖片和文字 屬性 text textFormat Qlabel獨有的機制&#xff1a;buddy setTextFormat 插入圖片 設置圖片根據窗口大小實時變化 Qt中表…

Springboot 項目一啟動就獲取HttpSession

在 Spring Boot 項目中&#xff0c;HttpSession 是有狀態的&#xff0c;通常只有在用戶發起 HTTP 請求并建立會話后才會創建。因此&#xff0c;在項目啟動時&#xff08;即應用剛啟動還未處理任何請求&#xff09;是無法獲取到 HttpSession 的。 方法一&#xff1a;使用 HttpS…

Step9—Ambari Web UI 初始化安裝 (Ambari3.0.0)

Ambari Web UI 安裝 如果還不會系統性的部署&#xff0c;或者前置內容不熟悉&#xff0c;建議從Step1 開始閱讀。不通版本針對于不同操作系統可能存在差異&#xff01;這里我也整理好了 https://doc.janettr.com/install/manual/ 1. 進入 Ambari Web UI 并登錄 在瀏覽器中訪…

熱門大型語言模型(LLM)應用開發框架

我們來深入探索這些強大的大型語言模型&#xff08;LLM&#xff09;應用開發框架&#xff0c;并且我會嘗試用文本形式描述一些核心的流程圖&#xff0c;幫助您更好地理解它們的工作機制。由于我無法直接生成圖片&#xff0c;我會用文字清晰地描述流程圖的各個步驟和連接。 Lang…

機器學習數據降維方法

1.數據類型 2.如何選擇降維方法進行數據降維 3.線性降維&#xff1a;主成分分析&#xff08;PCA&#xff09;、線性判別分析&#xff08;LDA&#xff09; 4.非線性降維 5.基于特征選擇的降維 6.基于神經網絡的降維 數據降維是將高維數據轉換為低維表示的過程&#xff0c;旨在保…

太陽系運行模擬程序-html動畫

太陽系運行模擬程序-html動畫 by AI: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>交互式太陽系…

2025年全國青少年信息素養大賽 scratch圖形化編程挑戰賽 小低組初賽 內部集訓模擬題解析

2025年信息素養大賽初賽scratch模擬題解析 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】 scratch資料 Scratch3.0系列視頻課程資料零基礎學習scratch3.0【入門教學 免費】零基礎學習scratch3.0【視頻教程 114節 免費】 歷屆藍橋杯scratch國賽真題解析歷屆藍橋杯scr…

grid網格布局

使用flex布局的痛點 如果使用justify-content: space-between;讓子元素兩端對齊&#xff0c;自動分配中間間距&#xff0c;假設一行4個&#xff0c;如果每一行都是4的倍數那沒任何問題&#xff0c;但如果最后一行是2、3個的時候就會出現下面的狀況&#xff1a; /* flex布局 兩…

通義靈碼2.5——基于MCP實現我的12306火車票智能查詢小助手

本文因排版顯示問題&#xff0c;為保證閱讀體驗&#xff0c;請大家訪問&#xff1a; 通義靈碼2.5——基于MCP打造我的12306火車票智能查詢小助手-CSDN博客 前沿技術應用全景圖 本項目作為通義靈碼2.5的標桿實踐案例&#xff0c;展現了AI輔助開發在復雜業務系統中的革命性突破…

Unity Button 交互動畫

在UGUI的Button組件中&#xff0c;有一個過渡動畫表現的功能。可以對按鈕的不同交互狀態添加交互反饋動畫&#xff0c;來提高玩家的交互體驗。 交互狀態 名稱 描述 Normal 正常情況 Highlighted 高亮顯示&#xff0c;例如鼠標觸碰到按鈕點擊范圍 Pressed 按鈕被按下的時…