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 ...
随机推荐
- web 视频播放器clappr 相关
https://github.com/tjenkinson/clappr-thumbnails-plugin/ https://github.com/andrefilimono/clappr-flvj ...
- Tkinter 之爬虫框架项目实战
一.效果图 二.源码 ''' 测试内容页爬取''' def test_content_url(self): try: url = self.test_url_var.get().strip() ite ...
- es6学习1:let和const
一:let 类似var 但是所声明的变量,只在let命令所在的代码块内有效. 1) 不存在变量提升 // var 的情况 console.log(foo); // 输出undefined var ...
- 辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
- 20189220 余超《Linux内核原理与分析》第三周作业
操作系统如何工作的 第二章的基础知识 计算机的三大法宝:存储程序计算机,函数调用堆栈机制,中断. 堆栈:堆栈是C语言程序运行时必须使用的几率函数条用路径和参数存储的空间,具体作用分为:记录函数条用的框 ...
- C#构建可扩展的应用程序(插件)
构建可扩展的应用程序,特别是对于WinForm应用程序是特别有好处的.我们知道,企业的需求是瞬息万变的,企业在使用软件的过程中,很可能对于现有的需求有变动甚至是提出新的需求来,可是我们的软件已经部署在 ...
- 2019_软工实践_Beta收官
简介 组名:955 组长博客:点这里! 成员 031702329庄锡荣(组长) 031702309林晓锋 031702309侯雅倩 031702311陈珊珊 171709030吴珂雨 03170231 ...
- 关于SpringCloud、SpringBoot简单讲解
什么是Spring Boot 用我的话来理解,Spring Boot就是整合了框架的框架,它让一切依赖都变得有序简单,你不用操心A.jar是什么版本,又依赖哪些版本的jar,它默认配置了很多框架的使 ...
- git clone速度太慢的解决办法(亲测还有效)
https://www.linuxidc.com/Linux/2019-05/158461.htm 1.查找域名对应的ip地址,并修改hosts文件 linuxidc@linuxidc:~/linux ...
- Hadoop,Spark,Flink 相关KB
Hive: https://stackoverflow.com/questions/17038414/difference-between-hive-internal-tables-and-exter ...