当前位置: 首页 > news >正文

Android高级开发第一篇 - JNI(初级入门篇)

文章目录

  • Android高级开发JNI开发第一篇(初级入门篇)
    • 🧠 一、什么是 JNI?
      • ✅ 为什么要用 JNI?
    • ⚙️ 二、开发环境准备
      • 开发工具
    • 🚀 三、创建一个支持 JNI 的 Android 项目
      • 第一步:创建新项目
      • 项目结构示例
    • 🧪 四、第一个 JNI 示例:Hello from C++
      • 🧩 Java 代码(MainActivity.java)
    • 🛠 五、配置 CMake 构建脚本

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 双向调用
敬请期待!

相关文章:

  • 第一个桌面应用程序的创建
  • st倍增(st表)
  • [Rust_1] 环境配置 | vs golang | 程序运行 | 包管理
  • 配网导线自取电式视频监测装置
  • MySQL 索引详解:从基础到原理
  • 前端使用qrcode来生成二维码的时候中间添加logo图标
  • Python入门教程:从零基础到精通的完整指南
  • 重温经典算法——选择排序
  • 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
  • [Dify] Chatflow 与 工作流的差异解析:多轮对话与流程编排的真正区别
  • linux 安装python
  • Android第十一次面试多线程篇
  • UE5蓝图中播放背景音乐和使用代码播放声音
  • 【案例分享】蓝牙红外线影音遥控键盘:瑞昱RTL8752CJF
  • 阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口
  • ZYNQ移植FreeRTOS和固化和openAMP双核
  • 文件夹的命名与分类
  • Java设计模式之迭代器模式详解
  • tiktoken学习
  • 【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件
  • asp 网站支持多语言/找百度
  • 大型门户网站建设/网络游戏推广员
  • 做彩铃的网站/手机端搜索引擎排名
  • 英文淘宝网站建设/seo快速排名软件案例
  • wordpress 显示不全/北京网站seo费用
  • 做卷子的网站/互联网推广运营