当前位置: 首页 > news >正文

DevOps系列之 JNI实现Java调用C的实现案例

JNI(Java Native Interface)允许Java代码与其他语言编写的代码进行交互。以下是一个简单的JNI示例,演示如何使用JNI在Java中调用C/C++函数。

最终的目录结构如下:

JNI(Java Native Interface)允许Java代码与其他语言编写的代码进行交互。以下是一个简单的JNI示例,演示如何使用JNI在Java中调用C/C++函数。

1. 创建Java类

首先,创建一个Java类,其中包含一个native方法。

public class NativeDemo {  static {  System.loadLibrary("NativeLib"); // 加载动态链接库  }  public native int add(int a, int b); // native方法  public static void main(String[] args) {  NativeDemo demo = new NativeDemo();  System.out.println("Result: " + demo.add(2, 3));  }  
}

2. 生成JNI头文件

使用javah工具从Java类生成C头文件。在命令行中执行以下命令:

javah -jni NativeDemo

这将生成一个名为NativeDemo.h的头文件。
3 . 实现C/C++函数

在C/C++文件中实现头文件中声明的函数。例如,创建一个名为NativeDemo.c的文件:

#include <jni.h>  
#include "NativeDemo.h"  JNIEXPORT jint JNICALL Java_NativeDemo_add(JNIEnv *env, jobject obj, jint a, jint b) {  jint sum = a + b;  return sum;  
}


4. 编译动态链接库

使用GCC编译器将C/C++代码编译为动态链接库

gcc -shared -o NativeLib.dll NativeDemo.c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -L"%JAVA_HOME%\bin"

这会生成一个名为NativeLib.dll(Windows)或libNativeLib.so(Linux)的动态链接库。
5.  运行Java程序

确保NativeLib.dll(Windows)或libNativeLib.so(Linux)位于Java的库路径中,然后运行Java程序:

编译Java字节码文件
javac NativeDemo.java

运行程序

java NativeDemo

这将输出“Result: 5”,因为2 + 3 = 5。

相关文章:

  • 负载均衡概述
  • 微服务(1)
  • ROS学习记录:使用RViz观测激光雷达传感器数据
  • Hive中支持毫秒级别的时间精度
  • 浅谈冯诺依曼体系和操作系统
  • SQL 解析 — 如何轻松实现新增语句
  • vite+Vue3学习笔记(3)——界面设计
  • Mybatis Java API - SqlSessionFactoryBuilder
  • 【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点
  • SSH 端口转发:如何将服务绑定到本地 IP 地址
  • 观察者模式概述
  • 基于rk3568 Android H265推流SRS低延迟网页播放方案
  • Node.js--》node环境配置及nvm和nvm-desktop安装教程
  • 数字IC设计流程
  • MongoDB 数据类型
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【css3】浏览器内核及其兼容性
  • Apache Pulsar 2.1 重磅发布
  • HTTP 简介
  • JavaScript中的对象个人分享
  • Mac转Windows的拯救指南
  • Python - 闭包Closure
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 今年的LC3大会没了?
  • 离散点最小(凸)包围边界查找
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 异常机制详解
  • ionic入门之数据绑定显示-1
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ######## golang各章节终篇索引 ########
  • #if #elif #endif
  • $jQuery 重写Alert样式方法
  • (C语言)fgets与fputs函数详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (vue)页面文件上传获取:action地址
  • (差分)胡桃爱原石
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (算法)大数的进制转换
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .“空心村”成因分析及解决对策122344
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .a文件和.so文件
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net core 依赖注入的基本用发
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net mvc部分视图
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .project文件
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ A*实现 ] C++,矩阵地图
  • [BUUCTF 2018]Online Tool(特详解)
  • [BZOJ 2142]礼物(扩展Lucas定理)