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 项目
第一步:创建新项目
- 打开 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 双向调用
敬请期待!