Java 之 JNA(调用第三方库)

article/2025/10/8 4:30:34

是什么?

一、了解JNA之前,我们先了解一下JNA的前身JNI(Java Native Interface):通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 [1]  从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

图解:

注意jni的编写命名是有要求的,这里可以参考:https://baike.baidu.com/item/JNI/9412164?fr=aladdin#书写步骤

二、JNA(Java Native Access):提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

简而言之,就是jna基于jni的方式封装了很多api,在使用上面相对于jni来说简化了很多。

图解:

实践

三、举例:

1)编写c源码(sum.cpp)

extern "C" {int sum(int x, int y) {return x + y;}
}

2)装换成*.dll/*.so文件

windows
gcc -m64 -shared -o <dll_name> <c_name>

linux
gcc -m64 -fPIC -shared -o <so_name> <c_name>

注意:
windows环境中,使用windows的c环境导包,名称可以随便取,用dll的文件格式。linux中使用linux的c环境打包,以lib(name).so的方式命名。

windows版本要在windows下编译,linux版本在linux下编译。

注意这里要说明一下,windows下的gcc是使用MinGW编译的,而且最好是64位的,否则可能使用的springboot64位加载失败。

具体如何安装MinGW,这里有如下链接:

MinGW32:点我
(防止网页失效,可直接去这里下载)

MinGW64:点我
(防止网页失效,可直接去这里下载)

32位的需要下载之后对编译器进行配置,64位不需要配置。

测试是否可以使用gcc

cmd ==> 输入命令:gcc -v

3)目录结构:

4)maven依赖(pom.xml)

<dependency><groupId>com.sun.jna</groupId><artifactId>jna</artifactId><version>3.0.9</version>
</dependency>

5)实现过程

package com.cetc.util;import com.sun.jna.Library;
import com.sun.jna.Native;import java.io.File;public class SumUtil {public interface Sum extends Library {//动态库接口int sum(int x, int y);//创建动态库实例Sum INSTANCE = (Sum) Native.loadLibrary("sum", Sum.class);}//加载库的绝对路径,这里是windows测试使用的,如果在linux下运行,注释下面static中代码static {File file = new File("src/main/resources/lib/sum.dll");System.load(file.getAbsolutePath());}//测试public static void main(String[] args) {System.out.println("***************************");System.out.println(Sum.INSTANCE.sum(1,2));System.out.println("***************************");}
}

6)测试效果

四、总结:JNA在很大程度上面简化了不同语言之间的连接,通过动态库的方式,来提供给Java调用。使用场景一般用于性能要求比较高的场景,比如opencv等。

注意:在实际开发工程中,不能直接把dll/so文件打入jar,因为System.load,加载的是绝对路径,可以放入Java的include.或者使用assembly的打包方式等。

关于linux下libxxx.so动态库位置

建议放到/lib64目录下,执行命令ldconfig重新加载动态库即可。

下面说明一下:

Java加载dll或so库文件的路径 java.library.path

1. Java的System.load 和 System.loadLibrary都可以用来加载库文件
2.例如你可以这样载入一个windows平台下JNI库文件:
System.load("C://Documents and Settings//TestJNI.dll"); 绝对路径
3. System.loadLibrary参数为库文件名
例如你可以这样载入一个windows平台下JNI库文件
System.loadLibrary ("TestJNI");
这里TestJNI必须在 java.library.path这一jvm变量所指向的路径中,可以通过如下方法获得该变量的值:
  System.getProperty("java.library.path");
默认情况下,Windows平台下包含下面的路径:
  1)和jre相关的目录
  2)程序当前目录
  3)Windows目录
  4)系统目录(system32)
  5)系统环境变量path指定的目录

4.在linux下添加一个java.library.path的方法如下:
  在/etc/profile 后面加上一行 export LB_LIBRARY_PATH=路径

5.在执行程序的时候可以显示指定, -Djava.library.path=路径,这种会清除掉预设置的java.library.path的值 。实例如下:
java -jar -Djava.library.path=/home/fly/Desktop/sound_dream  sound.war
 

说明

以上知识是本人参考其他网址并自我实践总结出遇到的问题,大部分来自原文内容,再加上少部分自己遇到的问题。

在此向原文作者表示感谢。

以上内容如有任何问题,请指正。

参考文章:

https://www.cnblogs.com/ll409546297/p/11534886.html

Java加载dll或so库文件的路径 java.library.path_jvm so文件路径_随风而飞_1的博客-CSDN博客


http://chatgpt.dhexx.cn/article/BXiZPXmJ.shtml

相关文章

JNA实战笔记汇总(一)—— JNA简介及demo环境创建

目录 1、简介 2、原理 3、配置环境&#xff0c;创建demo 3.1 搞清楚.dll/.so文件适用环境 3.2 创建一个普通的maven项目 3.2.1 将.dll/.so文件放在resources根路径下 3.2.2 pom.xml文件添加jna依赖 3.2.3 编写一个CLibrary接口&#xff0c;继承Library接口 3.2.4 编写…

ROW(行)与COLUMN(列)

数列数&#xff0c;COLUMNS&#xff08;A:B&#xff09;2&#xff0c;即A到B一共两列。

column函数HTML5,column函数 excel中column函数的使用方法

column函数是一种查询的工具,我相信许多人都不会使用到这一个函数,因此在实际工程当中并不是十分的常见,然而这一款韩束如果能够掌握,对我们的工作也是非常有帮助的,接下来我们就一起来好好的了解一下这个函数究竟该如何使用。 column函数——column函数的使用方法 1.colu…

Duplicate column name ‘xxx_column‘

错误场景: 使用MyBatisPlus分页查询的情况下列名重复(注:select查询不报错, 映射正常) 例如 → select id, name, name from user 解决方法: 列名重复&#xff0c;删除重复的列名, 保证留一个就可以了 错误原因: 根据错误定位到PaginationInterceptor的queryTotal方法 最终…

mysql插入报错:colum xxx cannot be null

测试同学催促我赶紧解决上面的问题&#xff0c;首先看了下数据库这个字段确实是必填的&#xff0c;默认是当前时间 可是看了下代码发现mybatis的sql语句插入的时候包含了这个operate_time字段 那么讲道理必需给实体对象的operateTime字段赋值才行&#xff0c;可线上代码明明没有…

Vue template中函数获取el-table-colum中的属性值

方案如下&#xff1a; <el-table-column prop"id" label"操作"><template slot-scope"scope"><istyle"margin: 0 10px; cursor: pointer"click"clickItemInfo(scope.$index, scope.row,scope.column,scope.row.i…

hbase架构原理之region、memstore、hfile、hlog、columm-family、colum、cell

**鄙人的新书《elasticsearch7完全开发指南》&#xff0c;欢迎订阅&#xff01;** ----- https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7 **《kibana权威指南》** ---- https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21 Hbas…

Row Column

Row Column 参考&#xff1a; Row classFlutter Layout Cheat SheetFlutter — Row/Column Cheat Sheet mainAxisAlignment和crossAxisAlignment 属性mainAxisAlignment和crossAxisAlignment mainAxisAlignment - 表示的是主轴的对齐方式crossAxisAlignment - 表示的是次轴…

Mybatis中resultMap的Colum和property属性

1&#xff1a; resultMap标签 当我们的数据库字段与实体类的属性不一致时&#xff0c;就需要使用该标签进行一一映射。 2&#xff1a;使用情况 2.1 简单查询 <resultMap id"这个resultMap的id" type"对应实体类的全限定类名"><id column"…

CSS3多列布局columns相关属性

tip&#xff1a;有问题或者需要大厂内推的我脉脉哦&#xff1a;丛培森 ٩( ‘ω’ )و CSS3中增加了可以实现多列布局的属性 在此之前的实现很麻烦可能需要各种定位 现在我们只需要一个属性就可以实现 多列布局类似于我们的报纸布局 这样可以方便读者观看 #多列数量与多列宽度#…

mysql5.7以上报错:Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated colum

这里写目录标题 一、前言二、解决方法临时解决&#xff1a;永久解决&#xff1a; 一、前言 在写sql时报错信息&#xff1a; 1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘pms.ru.role_id’ which is not functionall…

Vue+EleMentUI实现el-table-colum表格select下拉框可编辑

说明&#xff1a; 在进行采购入库的过程中&#xff0c;有必要对表格中的一行进行快速编辑保存&#xff0c;节省时间&#xff0c;提高工作效率&#xff01;&#xff0c;而不是每次编辑都要弹窗才可编辑 源码&#xff1a;https://gitee.com/charlinchenlin/store-pos 效果图&am…

Flutter学习(三)Row,Colum布局

主题 本文将介绍&#xff0c;flutter中的row&#xff0c;colum的用法。通俗来说&#xff0c;就是横向布局和纵向布局的用法。 开发环境 win10 androidstudio2022.1.1 jdk11 fluttersdk-flutter_windows_3.7.8 源码 文末将会附上完整开源demo地址 开发过程 首先&#xff…

column多列布局

CSS3 新增多列布局适合排版很长的文字内容&#xff0c;让其多列显示。使开发者能够轻松实现报纸版式的布局。 colum的相关属性&#xff1a; 属性说明column-count属性值是一个数字&#xff0c;规定元素被分为几列column-width列宽column-gap列与列的间隔宽度column-rule列的间…

为什么函数f(x)=x²不是满射

看到许多同学在问这个问题&#xff0c;一时也不知道该问谁&#xff0c;今天就去刨根问底了一下。 大致弄清缘由了&#xff0c;很可能是有同学看到有一本书《高等数学第7版上册》&#xff08;同济大学数学系 编&#xff09;&#xff0c;其中的第一章 函数与极限 第2页 例1提到&…

e^x导数证明

证明当x→0时,e^x-1与x是等价无穷小 https://www.zybang.com/question/1888f36ace3f205309482870c58e8a64.html

关于优化公式的小白理解

1、为什么要将e(x)写成e(xdx)的形式&#xff1f; 2、J(x)是什么对什么的导数&#xff1f; 理解 1、形式上来说&#xff0c;e(x)和e(xdx)并没有任何区别&#xff0c;以为dx本身就是小量&#xff0c;只要xdx还在作用域&#xff1f;内&#xff0c;函数的意思就是一样的。 更土一点…

x 的平方根(牛顿迭代法)

x 的平方根 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根&#xff0c;其中 x 是非负整数。 由于返回类型是整数&#xff0c;结果只保留整数的部分&#xff0c;小数部分将被舍去。也就是说向下取整. 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根…

025 导数的四则求导法则之u+v、uv、u/v求导

025 导数的四则求导法则之uv及uv u/v求导

幂函数导数公式的推导

1 幂函数的定义域 【引理】 设幂函数 f ( x ) x α ( α ∈ R ) f(x)x^\alpha(\alpha\in R) f(x)xα(α∈R) 的定义域为 D α D_\alpha Dα​&#xff0c;则 &#xff08;1&#xff09;当 α 0 \alpha 0 α0&#xff0c; D α { x ∣ x ≠ 0 } D_\alpha\{x|x\neq 0\} Dα…