JNI便捷开发框架JNA框架之入门(一)

article/2025/10/8 4:25:50

一、JNA介绍

JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。它提供一组Java工具类用于在运行期动态访问系统本地共享类库而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

二、JNA调用过程

JNA调用C/C++的过程大致如下:
在这里插入图片描述
也就是说,不需要写任何C/C++的代码,我们就能调用C/C++的程序里面的程序

三、JNA版本与依赖

目前最高版本是5.9.0,JNA的项目是放在Github【点击访问】上面

maven项目可以使用直接依赖

<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.9.0</version>
</dependency>

普通java项目可以直接下载 jna-5.9.0.jar【点击访问】
然后引入项目中即可使用,引入方法可以参照 IDEA 导入外部JAR文件【点击访问】

四、 JNA使用演示

demo项目说明:
1、普通java项目,程序入口是main函数
2、c语言文件hello.c,生成动态链接库文件libhello.so
3、项目结构类HelloJNA加载libhello.so,调用其指定方法完成a+b的计算,返回计算结果
4、项目结构如下:
在这里插入图片描述

1、hello.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>/*** 返回a+b的值*/
int add(int a, int b){return a + b;
}

2、HelloJNA.java

import com.sun.jna.Library;
import com.sun.jna.Native;/*** 一个java类* 运行环境是linux,需要打包生成jar文件放到linux环境运行*/
public class HelloJNA {/*** 定义一个接口,默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary* 这个接口对应一个动态链接(SO)文件*/public interface LibraryAdd extends Library {// 这里使用绝对路径加载LibraryAdd LIBRARY_ADD = Native.load("/program/cpp/libhello.so", LibraryAdd.class);/*** 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义* 映射libadd.so里面的函数,注意类型要匹配*/int add(int a, int b);}public static void main(String[] args) {// 调用so映射的接口函数int add = LibraryAdd.LIBRARY_ADD.add(10, 15);System.out.println("相加结果:" + add);}
}

3、项目打包

打包java程序成可执行jar,具体可参考 该文章后半部分打包步骤【点击访问】
打包完之后,将 JNATestC.jar 文件上传到linux的 /program/cpp/ 目录

4、so文件

生成so动态链接库
把 hello.c 放到linux环境的 /program/cpp/ 目录下,并在该目录下运行

gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o libhello.so hello.c

5、运行程序

进入 /program/cpp/ 目录

cd /program/cpp/ 

此时 /program/cpp/ 文件列表是
在这里插入图片描述
执行java程序,执行结果符合预期
在这里插入图片描述

五、总结

通过上面一个简单的例子,我们可以看到,java项目里面不需要写任何除java外的程序就可以完成调用外部C/C++的程序。特别适用于对接第三方服务(程序),在第三方只提供C/C++SDK的时候。
相比于JNI的方式,大大降低了开发成本。

下一篇:JNI便捷开发框架JNA框架之指针参数Pointer(二)


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

相关文章

JNA简介

2019独角兽企业重金招聘Python工程师标准>>> JNA JNA&#xff08;Java Native Access &#xff09;提供一组Java工具类用于在运行期动态访问系统本地库&#xff08;native library&#xff1a;如Window的dll&#xff09;而不需要编写任何Native/JNI代码。开发人员只…

JNA的概念

1. JNA简单介绍 先说JNI(Java Native Interface)吧&#xff0c;有过不同语言间通信经历的一般都知道&#xff0c;它允许Java代码和其他语言&#xff08;尤其C/C&#xff09;写的代码进行交互&#xff0c;只要遵守调用约定即可。首先看下JNI调用C/C的过程&#xff0c;注意写程序…

Java 之 JNA(调用第三方库)

是什么&#xff1f; 一、了解JNA之前&#xff0c;我们先了解一下JNA的前身JNI&#xff08;Java Native Interface&#xff09;&#xff1a;通过使用 Java本地接口书写程序&#xff0c;可以确保代码在不同的平台上方便移植。 [1] 从Java1.1开始&#xff0c;JNI标准成为java平台…

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;函数的意思就是一样的。 更土一点…