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

java与C++的交互

  • 作者:我的青春不太冷
    • [引言 🌟](#引言 🌟)
    • [准备工作 🛠️](#准备工作 🛠️)
    • [实战演示 💻](#实战演示 💻)
      • [1️⃣ 创建支持C++的Android项目](#1️⃣ 创建支持C++的Android项目)
      • [2️⃣ C++代码编写](#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文件中:

c 复制代码
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");
    }

    @Override
    protected 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应用更强大、更加高效!

相关推荐
txzrxz7 小时前
拓补排序讲解
c++·算法·图论·排序
SimonKing7 小时前
OpenCode 桌面版这 10 天偷偷迭代了 5 个版本,你还在用旧版吗?
java·后端·程序员
小大宇7 小时前
python sqlalchemy 案例
开发语言·python
小保CPP7 小时前
OpenCV C++基于模糊数学的图像滤波
c++·人工智能·opencv·计算机视觉
Dontla7 小时前
冒烟测试介绍(Smoke Test、BVT构建验证测试、构建验收测试)与回归测试对比、与单元测试对比、与集成测试对比、Cypress
java·单元测试·集成测试
名字还没想好☜8 小时前
Go 结构体内存对齐:调整字段顺序,同样的字段省下 40% 内存
开发语言·后端·golang·go·内存对齐
暖和_白开水8 小时前
数据分析agent(十):loguru日志输出优化 和es 启动流程
java·elasticsearch·数据分析
减瓦8 小时前
Gradle 版本演进全景:构建工具的进化密码
java·gradle
玛丽莲茼蒿8 小时前
很难出错的Spring5(十)—— IOC进阶
java·开发语言·jvm
Ulyanov8 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头