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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 按钮被按下的时…