JNI实现Java调用C/C++代码详细代码示例

 更新时间:2025年02月20日 10:27:29   作者:WolfAndCat  
这篇文章主要介绍了JNI实现Java调用C/C++代码的相关资料,JNI是Java/Kotlin与C/C++语言之间的交互桥梁,用于调用C/C++代码以解决高性能问题,文中通过代码介绍的非常详细,需要的朋友可以参考下

1.  JNI是什么?

JNI(Java Native Interface),是实现Java/Kotlin与C/C++语言之间交互的桥梁。说的更简单易懂一点,就是java语言和C++语言要想交互的话,必然存在数据类型之间不兼容的问题,这时候必须要有一个中间层去做转换。

2.  JNI 的意义

我们在实际项目开发中,很多高性能的算法,游戏画面渲染,音视频编解码等方面的程序都是用C/C++开发的。JNI可以帮助我们实现调用这些C/C++的代码,也可以实现C/C++代码调用外部的Java/Kotlin代码。这样做到既然满足Java语言可以快速开发Java后端或者Android客户端业务,也可以满足底层应用所需要的性能问题。

3. JNI的版本问题说明

JNI存在JDK和NDK两种版本,JNI最初是存在JDK里面的,后来NDK里面专门对JNI进行了封装。NDK(Native Development Kit)是Android平台提供的Native 开发工具集,所以我们目前开发Android程序都是采用NDK里面的JNI。

在设置页面勾选安装NDK和CMake

4. JNI工程创建

4.1 创建Native C++工程

4.2 在cpp目录下添加C++文件

Calculator.h

#ifndef JNITEST_CALCULATOR_H
#define JNITEST_CALCULATOR_H

class Calculator {
public:
    int Add(int a, int b);
};

#endif //JNITEST_CALCULATOR_H

Calculator.cpp

#include "Calculator.h"

int Calculator::Add(int a, int b)
{
    return a + b;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.22.1)

project("jnitest")

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

add_library(${CMAKE_PROJECT_NAME} SHARED
        native-lib.cpp
        Calculator.cpp)

target_link_libraries(${CMAKE_PROJECT_NAME}
        android
        log)

4.3 java调用C++程序

在java文件中添加调用函数,函数声明加上native。将鼠标悬浮,然后点击 “Creat JNI function xxxx” 就会自动在native-lib.cpp文件中生成JNI的函数

完善native-lib.cpp中的JNI的函数

#include <jni.h>
#include <string>
#include "Calculator.h"

extern "C"
JNIEXPORT jint JNICALL
Java_com_cat_jnitest_MainActivity_CplusplusAdd(JNIEnv *env, jobject thiz, jint a, jint b) {
    // 这里因为jint和int的类型的范围是一样的,所以不需要转换
    Calculator cal;
    jint ret = cal.Add(a, b);
    return ret;
}

4.4 程序测试

java中调用

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        TextView tv = binding.sampleText;
        String str = "JNI: a + b = ";
        int add = CplusplusAdd(100, 200);
        str += String.valueOf(add);
        tv.setText(str);
    }

 运行效果

总结 

到此这篇关于JNI实现Java调用C/C++代码的文章就介绍到这了,更多相关JNI实现Java调用C/C++内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java jdk升级版本注意事项经验分享

    Java jdk升级版本注意事项经验分享

    这篇文章主要介绍了Java jdk升级版本注意事项的相关资料,涉及兼容性风险、JVM与GC机制变更、运维与环境配置风险等多方面内容,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-02-02
  • @Value注入List、数组、Set、Map问题

    @Value注入List、数组、Set、Map问题

    这篇文章主要介绍了@Value注入List、数组、Set、Map问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java实现调用对方http接口得到返回数据

    Java实现调用对方http接口得到返回数据

    这篇文章主要介绍了Java实现调用对方http接口得到返回数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 基于Java中字符串indexof() 的使用方法

    基于Java中字符串indexof() 的使用方法

    今天小编就为大家分享一篇基于Java中字符串indexof() 的使用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • spring中WebClient如何设置连接超时时间以及读取超时时间

    spring中WebClient如何设置连接超时时间以及读取超时时间

    这篇文章主要给大家介绍了关于spring中WebClient如何设置连接超时时间以及读取超时时间的相关资料,WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端,它提供一种简便的方式来处理HTTP请求和响应,需要的朋友可以参考下
    2024-08-08
  • 详解Java接口签名(Signature)实现方案

    详解Java接口签名(Signature)实现方案

    这篇文章主要介绍了Java接口签名(Signature)实现方案 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • springboot验证码生成以及验证功能举例详解

    springboot验证码生成以及验证功能举例详解

    登录注册是大部分系统需要实现的基本功能,同时也会对登录验证增加需求,下面这篇文章主要给大家介绍了关于springboot验证码生成以及验证功能的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java常用的数据脱敏方法(手机、邮箱、身份证号)

    Java常用的数据脱敏方法(手机、邮箱、身份证号)

    这篇文章主要给大家介绍了关于Java常用的数据脱敏(手机、邮箱、身份证号)的相关资料,信息脱敏对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,需要的朋友可以参考下
    2023-07-07
  • 详解java中的Collections类

    详解java中的Collections类

    这篇文章主要为大家详细介绍了java中的Collections类,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Spring boot集成Kafka消息中间件代码实例

    Spring boot集成Kafka消息中间件代码实例

    这篇文章主要介绍了Spring boot集成Kafka消息中间件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论