在Android中通过JNI实现Java与C++的交互:Hello World示例

news/2025/1/24 12:01:13/

java与C++的交互

  • 作者:我的青春不太冷
    • 引言 🌟
    • 准备工作 🛠️
      • 环境要求
    • 实战演示 💻
      • 1️⃣ 创建支持C++的Android项目
      • 2️⃣ C++代码编写
    • 代码解析 📚
    • 实用技巧 💡
    • 下一步学习 📈

作者:我的青春不太冷

发布时间:2025-01-21

引言 🌟

在Android开发的世界里,有时候Java的性能可能无法满足我们的需求。这时候,C++就像是一位强大的盟友,通过JNI(Java Native Interface)的桥梁,我们可以完美地结合两种语言的优势。今天,让我们通过一个简单的"Hello World"示例,揭开Java与C++交互的神秘面纱!

准备工作 🛠️

环境要求

  • Android Studio
  • NDK (Native Development Kit)
  • CMake

实战演示 💻

1️⃣ 创建支持C++的Android项目

在Android Studio中创建新项目时,请务必勾选"Include C++ Support"选项。

2️⃣ C++代码编写

native-lib.cpp文件中:

cpp
#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello World from C++";return env->NewStringUTF(hello.c_str());
}// 新增一个计算平方的函数
extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapplication_MainActivity_squareFromJNI(JNIEnv* env,jobject /* this */,jint number) {return number * number;
}

3️⃣ Java代码实现
在MainActivity.java中:

java">Java
public class MainActivity extends AppCompatActivity {// 加载native库static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());// 新增:调用squareFromJNI函数并显示结果int number = 5;int result = squareFromJNI(number);TextView squareTextView = findViewById(R.id.square_text);squareTextView.setText("Square of " + number + " is " + result);}// 声明native方法public native String stringFromJNI();public native int squareFromJNI(int number);
}

4️⃣ CMake配置
在CMakeLists.txt中:

CMake cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED
src/main/cpp/native-lib.cpp)

find_library(log-lib log)

target_link_libraries(native-lib ${log-lib})

代码解析 📚

JNI方法命名规则
JNI中的方法命名遵循一定的规则:
Java_包名_类名_方法名

在本示例中,stringFromJNI方法在C++中实现,并通过JNI与Java交互。

关键步骤解释
加载原生库:在MainActivity的静态代码块中使用System.loadLibrary(“native-lib”)加载C++库。
声明native方法:public native String stringFromJNI();声明一个原生方法。
JNI实现:C++中的JNIEXPORT函数将字符串返回给Java。
运行效果 🎯
当你运行应用时,屏幕上将显示来自C++的问候:

java">Hello World from C++

实用技巧 💡

使用extern "C"确保C++编译器不会对函数名进行重整(即防止C++的名称修饰)。
利用JNI提供的工具函数进行Java与C++类型的转换。
配置build.gradle中的NDK选项以便编译C++代码。
总结 🎉
通过这个简单的示例,我们实现了Java和C++的交互。我们可以利用C++处理性能敏感的计算任务,复用现有的C++库,提升Android应用的效率。

下一步学习 📈

JNI数据类型转换
异常处理
多线程操作
内存管理
通过合理使用Java和C++的混合编程,能够让你的Android应用更强大、更加高效!


http://www.ppmy.cn/news/1565778.html

相关文章

解锁跨平台通信:Netty、Redis、MQ和WebSocket的奇妙融合

目录 一、业务场景分析合 &#xff08;一&#xff09;实时聊天系统 &#xff08;二&#xff09;数据推送服务 &#xff08;三&#xff09;分布式系统间通信 二、实现方案与代码实例 &#xff08;一&#xff09;环境搭建 &#xff08;二&#xff09;Netty 与 WebSocket 集…

【玩转全栈】----Django基本配置和介绍

目录 Django基本介绍&#xff1a; Django基本配置&#xff1a; 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍&#xff1a; Django是一个开源的、基于Python的高级Web框架&#xff0c;旨在以快速、简洁的方式构建高质量的Web…

对称二叉树(力扣101)

这道题翻译过来就是判断根节点的左右子树是否可以通过翻转&#xff0c;变得完全一样。如果可以&#xff0c;则这棵二叉树为对称二叉树。那么什么样的左右子树可以通过翻转相互变换呢&#xff1f;它们的节点的数值一定对称分布。那么我们就需要同时遍历左右树&#xff0c;不断比…

ASP.NET Core--依赖注入(DI)--在ASP.NET Core中使用依赖注入

一、在ASP.NET Core中实现依赖注入 1.1 配置依赖注入 在ASP.NET Core中实现依赖注入的第一步是配置依赖注入。ASP.NET Core使用了一个称为依赖注入容器&#xff08;DI Container&#xff09;的组件来管理对象之间的依赖关系。DI容器在应用程序启动时被配置&#xff0c;并且可…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后&#xff1a; 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…

Linux——线程条件变量(同步)

Linux——多线程的控制-CSDN博客 文章目录 目录 文章目录 前言 一、条件变量是什么&#xff1f; 1、死锁的必要条件 1. 互斥条件&#xff08;Mutual Exclusion&#xff09; 2. 请求和保持条件&#xff08;Hold and Wait&#xff09; 3. 不可剥夺条件&#xff08;No Preemption&…

Swift 实现:颠倒 32 位无符号整数的二进制位

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

缓存之美:万文详解 Caffeine 实现原理(下)

上篇文章&#xff1a;缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;上&#xff09; getIfPresent 现在我们对 put 方法有了基本了解&#xff0c;现在我们继续深入 getIfPresent 方法&#xff1a; public class TestReadSourceCode {Testpublic void doRead() …