JNI技术学习(一):在Java中调用C++/C代码

Java通过JNI调用C/C++函数 在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某个体系架构或者操作系统特有功能的支持。为了能在Java 代码中调用 C/C++函数,JVM提供了Java Native Interface(JNI)机制。 在Java中,使用native关键字标注的、没有方法体的方法就是native方法。当在 Java 代码中调用这些 native 方法时,Java 虚拟机将通 阅读详情

博主近期在实习,遇到一个需要,就是如何在JAVA代码中调用C++的算法。背景:已经有封装好的C++算法,然后现在要用JAVA语言编写一个平台,要在平台中调用已经写好的C++代码。这里我们就要借助:JNI。
JNI是Java Native Interface的缩写,它是JDK的一部分,提供了若干的API实现Java和其他语言的通信(主要是C或C++)。但这种有一个缺点就是使用Java与本地已编译的代码交互,通常会丧失平台可移植性。但有一些情况下,是可以接受的,甚至是必须的。例如使用一些旧的库,或者与硬件、操作系统进行交互等。(这里要注意,JNI也可以让C++代码调用JAVA代码)
接下来我们就借助JNI实现一个简单从JAVA中调用C++代码的HelloWorld。

1. 编写JAVA代码

这里写图片描述
我们注意到,上图的代码中,出现了 native 关键字,这里,我们先介绍一下 native 关键字:

  • native关键词修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在其他语言中实现的。
  • 这里编写带有native声明的方法的java文件,就是表明了有对应其他语言实现了这些方法。

2. 生成头文件

先执行 javac 指令,生成对应的 .class 文件
这里写图片描述
再执行 javah 指令,生成对应的头文件
javah -classpath xx -jni yy
其中 xx 为 src 文件夹的目录
yy 为包名 + class文件名
这里写图片描述
生成头文件:
这里写图片描述

3. 创建其他语言的工程

我们这里选择实现C++语言的例子,工程搭建过程如下:
这里写图片描述
这里写图片描述

这里写图片描述
生成项目文件后,我们要导入以下的三个头文件
这里写图片描述
其中,

  • aa_bb_cc_Hello.h:为之前 JAVA 代码生成的头文件
  • jni_md.h:在jdk包内,路径:\Java\jdk1.8.0_152\include\win32
  • jni.h:在 jdk包内,路径:\Java\jdk1.8.0_152\include

这里要注意:要修改导入 JAVA 代码生成的头文件:
这里写图片描述
修改为:
这里写图片描述

4. 编写C++代码

这里写图片描述

5. 生成dll文件

这里写图片描述
这里写图片描述

6. 编写 JAVA 代码,实现调用 C++ 函数

这里写图片描述
这里 System.loadLibrary("") 导入 dll 或 so 文件
但我们尝试执行,发现报错:
这里写图片描述
这里没有 java.library.path ,我们进行配置:
在项目处右键:Properties -》Java Build Path -》Source -》Native library location
这里写图片描述
在这里配置存放 dll 或 so 的文件目录
这里写图片描述
切到 Libraries -》 Native library location
这里写图片描述
在这里配置存放 dll 或 so 的文件目录
这里写图片描述
再次尝试运行,但是发现还是报错,为什么呢?
这里写图片描述
这里是因为,生成的dll,是在 win32 的环境下生成的,32位的dll,但是 JDK 是64位的,这里处理的方式有两种,一个是通过 VS 环境下生成 win64 的dll,另外一种方式就是使用32位的 JDK,我这里使用32位的 JDK 重新创建 JAVA 项目,成功运行:
这里写图片描述

JNI-Java调用C++ 通过JNI,快速实现Java调用C++函数的方法 阅读详情

相关推荐

JNI简单实现Java调用C++/C的HelloWorld

简介 JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,它是一种双向的接口,使得开发者可以通过Java代码调用到各种native的 库,反之亦然。所以JNI(Java Native Interface)能作为Java语言的一部分,她能够作为粘合剂将Java应用和其他

Solidfish的专栏 1万+

(混合编程)Java JNI调用C/C++代码编程,看这篇就够了!

最近项目中混合编程,算法程序使用C/C++编写,而算法服务器是Java开发的。为便于开发整合,于是决定使用Java JNI来实现C/C++算法部分代码的调用。于是也就有了这篇文章。本文以Windows系统上使用Java JNI混合编程为例,Linux系统上同理(Linux系统上的动态链接库为.so后缀结尾)。 本文目录 1、创建Java工程 1.1 新建Java工程 1.2 编写对应C/C++程序的Java对象类 2、编译制作dll动态库 2.1 创建dll工程 2.2 编写C/C++源文件

qq_41969790的博客 2926

JNI C 语言中开启线程调用Java中方法

Android 开发菜鸟,请大家多多指教!   1、 在C中直接调用与开启线程调用java方法是有所不同,这是由JNIEnv *env的使用限制引起的。      JNIEnv *env是一个结构体指针它指向JNI函数表,通过它能调用JNI所有函数来使用虚拟机的各种功能,例如;查找某个类(验证是否被VM加载、创建各种基本类数组、调用java方法等,它的方法几乎都是很有的),它是一个指向线程的局...

老衲想你的博客 2397

Java如何利用JNI调用C++(简略介绍及步骤)

快速上手Java实现对C++调用(JNI)

syusyusyu1的博客 5711

C++库封装JNI接口-实现java调用c++

C++库封装JNI接口-实现java调用c++

智能座舱通信技术解析:从CAN总线到车载以太网与V2X

在汽车电子与智能网联快速融合的背景下,座舱智能化已不再是简单的屏幕堆砌,而是依赖底层通信技术构建的复杂系统。CAN总线因高可靠性与确定性传输,持续承担车身控制与安全信号的传递;车载以太网则凭借高带宽优势,成为多屏高清视频与OTA升级的核心通道;V2X车路协同技术进一步将座舱与外界的实时信息互联。理解这些技术的分工协作,是掌握智能座舱架构、开展座舱测试与故障排查的关键。本文从实际测试经验出发,梳理不同总线在座舱内部及外部的应用逻辑,结合低成本的实验台架搭建指南,展示从信号采集、网关转发到多媒体流传输的完整链路

weixin_29284657的博客 341

Java调用c/c++(JNI)最详细步骤

非常详细的JNI入门,让java调用c/c++函数。避免了过程中间一些坑,不用四处去翻了。

m0_70722785的博客 8866

Gephi实战指南——从数据导入到可视化输出

本文详细介绍了Gephi数据可视化工具的使用方法,从数据导入到可视化输出的全流程实战指南。涵盖Gephi三大工作区功能、数据导入技巧、图形编辑进阶操作以及专业级可视化输出方案,帮助用户高效完成社交网络分析等复杂任务。

weixin_28731223的博客 480

Java如何调用C程序,JNI技术

Java如何调用C语言程序,JNI技术 Java为什么要调用C语言编写的程序 因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语言去处理,然后Java调用C语言的接口。 使用Java如何去调用C语言的接口呢? 使用Java的JNI技术。 具体调用步骤 CentOS7环境下 首先创建Ja...

追风人的博客 2万+

非易失存储器读写

24C256、IIC_SCL、IIC_SDA

CT_1104的专栏 2984

SFF-8654接口引脚定义全解析:从SAS到U.2的高速硬件连接核心

在高速数据存储与传输领域,接口标准是连接主机与存储设备、确保信号完整性与协议互通性的物理基础。其核心原理在于通过精确定义的物理引脚和电气特性,承载不同的高速串行通信协议,如SAS和PCIe。这类高密度连接器的技术价值在于以紧凑的形态支持多协议兼容与高速率传输,满足了企业级存储、高性能计算对带宽和可靠性的苛刻要求。典型的应用场景包括服务器硬盘背板连接、NVMe U.2固态硬盘直连以及外部存储扩展。本文聚焦于SFF-8654(亦称Mini SAS HD)这一关键接口,深入剖析其引脚定义、信号分区(如高速数据通道

weixin_29188043的博客 705

[JNI]使用jni实现简单的Java调用本地C语言代码

我们知道,Java的主要优势之一是其可移植性——这意味着一旦我们编写并编译代码,这个过程的结果就是平台独立的字节码。简单来说,这可以在任何能够运行Java虚拟机的机器或设备上运行,而且它的工作会像我们所期望的那样无缝进行。然而,有时我们确实需要使用为特定架构原生编译的代码。需要处理某些硬件对非常苛刻的过程进行性能提升我们希望复用而不是用Java重写的现有库。为了实现这一点,JDK引入了一个桥梁,连接了在我们的JVM中运行的字节码和原生代码(通常用C或C++编写)。

XuJiaKai的博客 1076

『杭电1199』Color the Ball

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to

漠宸离若的博客 496

java 调用c_java调用C++/C的三种方式

Java调用C++/C有3中方式:JNI、JNA、JNative。注:1、个人觉得还是JNA的方式最好。2、Java和C++/C交互的难点在于数据结构的对应3、java不可以直接调用C#代码,C#代码需要托管JNI(Android调用,普通java类似)使用步骤:1、编写静态方法(用java声明)2、编译生成class文件3、编译生成h文件4、编写C文件(用C/C++实现)5、配置NDK6、配置s...

weixin_30665313的博客 2543

【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

随着时代的进步和科技的迅猛发展,人们对居住安全的重视程度不断提升,对安全防范系统的需求也日益增强。在安防系统中,门禁系统占据着重要的位置。传统的门禁控制方式主要依靠钥匙、密码和门禁卡等,这些方式易于被破解和复制,安全性较低。然而,近年来,生物识别技术的迅速发展和成熟,为解决这一问题提供了新的方案。生物识别技术具备便携性、非易失性、不易遗忘以及难以盗用等优点,逐渐被引入到门禁系统中。传统的小区门禁系统往往依赖人工管理,存在一定的局限性,难以满足用户多样化的需求,也浪费了人力资源。

嵌入式技术开发 1万+

解锁轻量化网络实验室:在 Containerlab 中部署 Cisco IOL 设备的详细教程

Cisco IOS On Linux(IOL)是 Cisco IOS-XE 的简化版,它是 Cisco IOS 的一种轻量级实现。IOL 并不需要完整的虚拟机(Virtual Machine, VM)环境,可以直接在 Linux 上运行,极大地减少了对系统资源的需求。IOL 节点通过更精简的方式提供了 Cisco IOS 功能,适合构建实验室、测试网络协议和验证网络设计。

网络技术联盟站 476

【Android JNI - 3】在Java中通过JNI调用C代码示例

JavaCallC 简单示例三一、 JavaCallC 简单示例三1、实现 Java 方法2、 根据 Java 方法,使用 javah 自动生成 jni 头文件(1) 在 \JavaCallC\app\src\main\java\ 目录下新增 jni 目录(2) 方法一:开启CMD窗口,进入\app\src\main\java 目录,运行 javah + 包名.类名(3) 方法二:开启CMD窗口,...

|~~~热爱生活、努力学习的小伙汁~~~| 770

随机优化 (Stochastic Optimization) 算法详解及案例分析

随机优化是一种用于处理包含随机变量的优化问题的方法。其目标是通过考虑随机变量的概率分布,找到一个在期望意义下最优的解。

闲人编程的博客 4172

java代码通过JNI调用c函数

java代码通过JNI调用c函数 一. 总览 在Java代码中通过JNI调用C函数的步骤如下: 第一步:编写java代码 :在Java类中声明本地方法 第二步:编译java代码 :javac HelloJNI.java 生成 HelloJNI.class 第三步:生成C语言头文件 :使用javah命令,生成饱含JNI本地函数原型的头文件 第四步:编写C代...

阿路 1049

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java调用C/C++那些事(JNI)

例子中,创建一个HelloWorld类。本地方法声明,表示该方法的具体实现不在Java代码中,而是在通过System.loadLibrary加载的本地库中实现。定义了四个本地方法,输入和输出都是基本数据类型intstatic{定义了两个方法,一个是输入字符串,一个是输出字符串。static{定义一个对象,表示点,保存坐标x、y,提供get、set方法this.x=x;this.y=y;//get、set、toString方法省略。

weixin_42524843的博客 1645

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JNI: C/C++调用Java方法

C/C++调用Java方法步骤: FindClass: 可以在C/C++层找到Java层的类 GetMethodID/GetFieldID:得到Java层中所有的类/属性 NewObject:创建对象,这个对象就代表内存中一个Java对象。有了这个对象之后,再通过GetMethodID/GetFieldId取到的MethodID(其实它就是个索引值)/FieldID,类中这个方法/属性的索...

手写我对你的温柔 5152

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java安卓JNI调用C库入门指南

JNI是Java与C/C++之间进行交互的一种技术,它允许Java代码调用本地方法(即C/C++编写的函数),同时也允许C/C++代码调用Java对象和方法。通过JNI,我们可以实现Java与C/C++之间的双向通信,充分利用两种语言的优势。

励志成为一名优秀的全能型软件开发工程师。 1332

java如何通过JNI调用C

JNI提供了一系列的API,可以用于从Java代码中调用本地C/C++函数,也可以将Java对象转换为本地C/C++中的数据类型,从而实现Java和本地代码之间的数据传递。由于Java虚拟机以及大部分Java类库都是用Java语言实现的,因此无法直接访问一些本地系统资源(例如操作系统的API,硬件接口等),这就需要通过JNI技术来实现。JNI还提供了一系列的函数,可以用于在本地代码中调用Java代码,从而实现Java和本地代码之间的双向交互。JNI的使用需要一定的C/C++语言基础,也需要了解。

qq_42208194的博客 1010

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

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

qq_64851111的博客 1164

Java通过JNI调用C的一个小DEMO

最近看java源代码,发现很多方法用native修饰,那么什么事native方法呢?     简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调

释迦不加糖、 8301

java调用c jni_Java调用C JNI

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法...

weixin_28712491的博客 4700
上一篇: java 发送http请求获得json 以及解析json
下一篇: JAVA多线程学习笔记(一): 多线程的基础概念以及Thread类常用方法介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值