JNI简单学习(java调用C/C++) - 实践

news/2026/1/21 12:32:55/文章来源:https://www.cnblogs.com/tlnshuju/p/19511016

JNI简单学习(java调用C/C++) - 实践

2026-01-21 12:21  tlnshuju  阅读(0)  评论(0)    收藏  举报

JNI

JNI(Java Native Interface)是 JDK 内置的标准原生接口,是 Java 平台与 C/C++ 等原生代码(Native Code)交互的底层规范,允许 Java 虚拟机(JVM)中的 Java 代码调用原生代码,也支持原生代码回调 Java 代码。与 JNA(基于 JNI 封装的上层类库)不同,JNI 是 Java 与原生代码通信的 “底层基础”,所有 Java 调用原生库的方案(包括 JNA、JNR 等)最终都基于 JNI 实现。

核心组件

组件作用
jni.h核心头文件,定义 JNI 的类型、函数、宏(如JNIEnv、jobject、FindClass);
JNIEnv*核心指针,提供 JNI 函数调用接口(如创建 Java 对象、调用 Java 方法、类型转换),线程私有;
JavaVM*Java 虚拟机实例指针,用于跨线程 / 跨进程获取JNIEnv,全局唯一;

关键类型映射(Java 对应 C/C++)

Java 类型JNI 类型C/C++ 类型
bytejbytesigned char
shortjshortshort
intjintint
longjlonglong long(8 字节)
floatjfloatfloat
doublejdoubledouble
booleanjbooleanunsigned char
charjcharunsigned short
Stringjstring无直接映射(需通过 JNI 函数转换为 char*)
Objectjobject无直接映射(指向 Java 对象的指针)
数组jarray/ jintArray/ jbyteArray对应数组类型指针

演示

演示环境:
开发环境为:idea、visual studio
java版本:jdk-17.0.15
c++:ISO C++14 标准 (/std:c++14)
x64环境下

1.创建Java 类

创建一个名为JavaCode的maven项目
声明native方法

public class NativeFunction
{
public native int add(int a, int b);
}

2.生成 JNI 头文件

通过Java 命令行生成包含方法签名的 C/C++ 头文件;

javac -h jni NativeFunction.java

执行完以上命令后,会生成一个jni文件夹,里面的org_example_NativeFunction.h文件就是c/c++的头文件
在这里插入图片描述

3.编写 C/C++ 实现

创建一个名为CPPCode的空项目
将生成的头文件(org_example_NativeFunction.h)移动到头文件夹下
在这里插入图片描述
此时头文件(org_example_NativeFunction.h)里面会报错,在windows环境中需要引入2个头文件,分别为:

jni.h
jni_md.h

这两个文件在java文件夹里面,比如下面这两个路径:

D:\Program Files (x86)\java\jdk-17.0.15\include
D:\Program Files (x86)\java\jdk-17.0.15\include\win32

点击项目属性,将上面2个路径放进附加包含目录里面
在这里插入图片描述
补充:如果没有C/C++选项有可能是没创建C/C++文件导致的,创建了就好了(提前创建NativeFunction.cpp文件)
在这里插入图片描述

实现头文件(org_example_NativeFunction.h)中声明的原生方法
创建NativeFunction.cpp文件

//引入头文件
#include "org_example_NativeFunction.h"
//实现方法,将需要使用的参数设置名称a,b
JNIEXPORT jint JNICALL Java_org_example_NativeFunction_add(JNIEnv*, jobject, jint a, jint b)
{
return a + b;
}

4.编译动态库

根据自己的平台配置

项目属性设置为:
配置类型设置为:动态库
在这里插入图片描述

生成解决方案:
我的是x64环境
在这里插入图片描述
然后点击生成解决方案
在项目的 \x64\Debug 目录下会生成ddl文件
在这里插入图片描述

5.Java加载动态库

将编译好的dll动态库放进资源文件夹下:
在这里插入图片描述

编写加载动态库的代码,Java 加载动态库并调用 native 方法。

public class Main
{
static
{
//加载动态库
String dllPath = System.getProperty("user.dir")+"\\src\\main\\resources\\CPPCode.dll";
//不支持classpath
System.load(dllPath);
}
public static void main(String[] args)
{
//创建NativeFunction对象
NativeFunction nativeFunction = new NativeFunction();
//调用add方法
int result = nativeFunction.add(5, 6);
System.out.println("add(5, 6) = "+result);
}
}

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1194494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java导出Excel慢如蜗牛?3个被忽略的JVM参数+2种零拷贝写入法,立竿见影提速17倍

第一章:Java导出百万级数据到Excel的性能挑战 在企业级应用中,将大量数据导出为 Excel 文件是常见的需求。然而,当数据量达到百万级别时,传统的导出方式往往会面临严重的性能瓶颈。Java 常用的 Apache POI 库虽然功能强大&#xf…

建议收藏】大模型推理技术详解:从显存管理到算法加速的全景指南

本文系统解析大模型推理技术的演进与优化,涵盖显存管理(PagedAttention、分层KV缓存)、注意力计算优化(FlashAttention系列)、调度与批处理(PD分离架构)、并行策略与MoE优化、算法加速&#xff…

2026皮带上料机选购指南:热门企业产品性能大比拼,传动链条/乙型网带/非标链条/料斗提升机,上料机公司怎么选择

在工业自动化生产中,皮带上料机作为物料输送的核心设备,直接影响着生产线效率与产品质量。尤其在玻璃、食品加工等高精度行业,其稳定性、耐久性及适配性成为保障安全生产、改善作业环境的关键因素。然而,当前市场上…

【资深架构师亲授】CORS跨域配置最佳实践,企业级项目都在用

第一章:CORS跨域问题的本质与Java解决方案概述 CORS(Cross-Origin Resource Sharing)是浏览器为保障网络安全而实施的一种同源策略机制。当一个资源试图从不同于其自身源(协议、域名、端口任一不同即视为跨域)的服务器…

大模型入门必收藏!一文看懂AI、机器学习、深度学习、LLM和Agent的关系

文章通过金字塔比喻,清晰解析了AI相关概念的层次关系:AI是顶层目标,机器学习是实现方法,深度学习是核心技术,大模型是规模化的深度学习产物,LLM是专门处理语言的大模型代表,Agent则是将大模型能…

C#进阶疗法 -- 拦截器

代码拦截器入门指南:使用 Castle.DynamicProxy 实现方法拦截 什么是代码拦截器? 代码拦截器是一种设计模式,允许我们在不修改原有代码的情况下,在方法执行前后插入自定义逻辑。这种技术在很多场景下非常有用,属于aop编…

浙江正规的胶辊包胶供应商有哪些,泰兴金茂辊业特色显著

在工业生产领域,胶辊作为关键传动与加工部件,其性能直接影响生产线效率与产品质量。当胶辊出现磨损、老化或脱胶问题时,选择靠谱的旧胶辊包胶厂家、靠谱的胶辊包胶翻新供应商及正规的胶辊包胶供应商,成为企业降低成…

揭秘Java CORS跨域难题:5步快速配置,彻底解决前后端分离痛点

第一章:Java CORS跨域难题的本质解析CORS(Cross-Origin Resource Sharing)是浏览器实现的一种安全机制,用于限制不同源之间的资源请求。当Java后端服务与前端应用部署在不同域名或端口时,浏览器会发起预检请求&#xf…

Spring Cloud Gateway鉴权过滤器深度剖析(架构师私藏笔记曝光)

第一章:Spring Cloud Gateway鉴权过滤器核心概念解析 在微服务架构中,API网关作为系统的统一入口,承担着请求路由、限流、监控和安全控制等关键职责。Spring Cloud Gateway 作为 Spring 官方推出的响应式网关框架,提供了强大的过滤…

国产化替代中WordPress如何兼容信创环境公式编辑?

要求:开源,免费,技术支持 博客:WordPress 开发语言:PHP 数据库:MySQL 功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台:Window…

收藏!大模型转型实战指南:从入门到求职,避坑全攻略

这两年,大模型技术彻底打破行业壁垒,从科研领域的专属议题,变成后端、测试、运维乃至跨行者的职业新选项,更是不少人职业转型的核心方向。 日常对接学员和行业朋友时,类似的疑问反复出现: “我做测试/运维多…

2025光纤滑环排行:国内热门款性能大PK,滑环定制/气动旋转接头/滑环/定制滑环/旋转接头,光纤滑环企业怎么选

随着5G通信、工业自动化与新能源装备的快速发展,光纤滑环作为旋转设备中实现光信号稳定传输的核心部件,其市场需求持续攀升。据行业统计,2025年国内光纤滑环市场规模预计突破25亿元,但产品同质化、技术参差不齐等问…

探讨膨胀管品牌商,南京哪家值得推荐,价格如何

一、基础认知篇 问题1:什么是膨胀罐?它在水循环系统中扮演什么角色? 膨胀罐是闭式水循环系统的核心稳压储能设备,依托罐内压缩气体与介质的压力动态平衡机制,实现系统压力的精准调节与稳定控制。其工作原理严格遵…

从Python到GPU加速:构建深度学习环境的6条黄金指令

第一章:Python环境的科学配置在现代软件开发中,Python 以其简洁语法和强大生态广受欢迎。然而,高效的开发始于科学的环境配置。合理管理 Python 版本与依赖包,不仅能避免“在我机器上能运行”的问题,还能提升团队协作效…

前端开发者如何在WordPress中实现Excel公式动态绑定?

要求:开源,免费,技术支持 博客:WordPress 开发语言:PHP 数据库:MySQL 功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台:Window…

为什么90%的人都写不对提取链接的正则?专家级避坑指南来了

第一章:为什么90%的人都写不对提取链接的正则?专家级避坑指南来了 在处理网页内容或日志分析时,提取URL是一个高频需求。然而,绝大多数人编写的正则表达式在实际应用中都会漏掉某些合法链接,甚至匹配到错误的内容。问题…

2026年消防水带厂家推荐:基于多场景实测评价,针对渗漏与霉腐痛点精准指南

消防水带作为消防灭火系统的核心输水部件,其性能与可靠性直接关系到应急救援的成败。当前,无论是大型工业设施、高层建筑还是社区消防系统,决策者在选择供应商时,普遍面临产品性能参差不齐、质量验证困难、长期耐用…

Java解决跨域问题完整指南(CORS配置从入门到生产级落地)

第一章:跨域问题的本质与CORS机制解析 在现代Web应用中,前端页面常需请求不同源的后端服务,而浏览器出于安全考虑实施了同源策略(Same-Origin Policy),限制了跨域HTTP请求。当协议、域名或端口任一不同时&a…

5.3 规模化管理:基于目录 vs 基于分支的多环境 多集群治理策略

5.3 规模化管理:基于目录 vs 基于分支的多环境/多集群治理策略 1. 引言:当应用数量从 10 到 100 单体应用迁到 K8s 尚可手工维护,微服务体量上来之后,环境维度(dev/staging/prod) 集群维度(多 Region/多租户/多云) 应用数量 会让任何脚本方案迅速失控。GitOps 的规模…

Vue.js vs React:全面对比

核心哲学差异方面Vue.jsReact设计理念渐进式框架声明式UI库核心思想"关爱开发者""拥抱函数式编程"学习曲线平缓&#xff0c;渐进式陡峭&#xff0c;概念较多模板 vs JSX模板为主JSX 为主1. 架构设计差异Vue - 渐进式框架<!-- Vue 2/3 模板语法 --> &…