JNA的应用
一、了解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来说简化了很多。
实现流程:
三、JNA的例子:
1)编写c源码(sum.cpp)
extern "C" {
int sum(int x, int y) {
return x + y;
}
}
2)装换成*.dll/*.so文件
windows
gcc -shared -o <dll_name> <c_name>
linux
gcc -fpic -shared -o <so_name> <c_name>
注意:windows环境中,使用windows的c环境导包,名称可以随便取,用dll的文件格式。linux中使用linux的c环境打包,以lib(name).so的方式命名。
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);
} 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的打包方式等。
五、源码:https://github.com/lilin409546297/JNA
JNA的应用的更多相关文章
- JNA 如何 加载多个 存在依赖的 DLL 库
JNA 的出现,极大的简化了原有的 JNI 技术.下面是JNA github地址:https://github.com/java-native-access/jna 1. 简单的一个例子: /** S ...
- 使用jna调用dll,jdk位数和dll位数的关系
最近在学习jna,发现dll文件能能否成功调用取决于jdk位数. 32位jdk只能使用32位的dll,64位jdk只能使用64位的dll,否则位数不对应的话报的错是 "Exception i ...
- JNA开发中的问题积累
[Qboy原创] 2013年12月28日 在开发一个项目过程中需要调用第三方的C的dll.由于是第一次在项目中使用JNA,很多都安装开发文档来做,但是出现了很多的问题. 由于很多接口还没调完,还不知道 ...
- JNA使用
JNA与C对应的数据类型: 注意: 使用byte[]对应C++中的char* 可以返回函数执行的结果值 一.添加JNA需要的jar包 1.jna.jar 2.plat ...
- JNA参数传递问题,Java数组
版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法. C语言结构体定义如下: typedef struct Rect { in ...
- JNA结构体参数传递,Java数组
JNA以结构体数组为参数进行调用: ////// C++ // student 结构体定义 typedef struct { int age; char name[20]; }Student; // ...
- java 用JNA方法调用C++动态链接库
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...
- jna 使用实例,
有与项目组需要用到C++的一个模块, 需要将一个2维数组传到dll 里面 ,返回一个字符串, 恶心了1天终于完成了, 记录一下,同时也希望能给你带来帮助. java 代码如下, package tes ...
- JNA—JNI终结者
JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...
- JNA入门实例
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...
随机推荐
- GoCN每日新闻(2019-10-16)
GoCN每日新闻(2019-10-16) GoCN每日新闻(2019-10-16) 1. 持续的性能分析与优化 https://medium.com/@tvii/continuous-profilin ...
- Noip2019暑期训练1
题目名称 时空定位 棋子移动 高精度乘法 数独游戏 存盘文件名 location piece mul sudoku 输入文件名 location.in piece.in mul.in sudoku.i ...
- 无法定位程序输入点到xxx.dll
Q:安装pytorch时报错无法定位程序输入点到Anaconda3\Library\bin\libssl-1_1-x64.dll A:下载libssl-1_1-x64.dll覆盖bin下的文件 下载地 ...
- 使用pwn_deploy_chroot部署国赛pwn比赛题目
目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...
- python 文件夹下的图片转PDF
from PIL import Image import os def rea(path, pdf_name): file_list = os.listdir(path) pic_name = [] ...
- 请写出css3样式的优先级,并排序
!important(权重最大)1000>内嵌样式(style="")>内部样式>外联样式>@import url("url");
- AnonymousPipeStream的使用案例
AnonymousPipeStream的使用具体案例如下: 服务端: using System; using System.Data; using System.Data.SQLite; using ...
- SpringBoot @Autowired中注入静态方法或者静态变量
注:用static去定义一个注入的方法或者配置文件值变量,编译时不会有任何异常,运行时会报空指针. Spring官方不推荐此种方法. 原理: https://www.cnblogs.com/chenf ...
- docker安装并运行mongo
拉镜像: [mall@VM_0_7_centos ~]$ sudo docker pull mongo:3.2 [sudo] password for mall: 3.2: Pulling from ...
- [LeetCode] 146. LRU Cache 近期最少使用缓存
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...