java native interface JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。

  JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。

  由于项目中经常要用到java调用so库的情况,这里做一个简单的使用笔记留着回顾。java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。

·JNI

·JNA

·JNative

java使用 JNI来调用dll动态库的调用,工作量略大,一般情况下开发人员会选用JNA或JNative。

使用JNative调用DLL除了要引入jar包外还需要额外引入一个dll文件,而JNA只需要引入jar即可使用。


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;public class JNADllCall {/*** DLL动态库调用方法 * stdCall模式,调用完内存清除*/public interface StdCallDll extends StdCallLibrary {// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary("dllName",StdCallDll.class);// 加载动态库文件// 声明将要调用的DLL中的方法(可以是多个方法)void printf(String format, Object... args);}/*** DLL动态库调用方法2* cdecl模式,调用完内存信息保留,数据由调用者清除 */public interface CLibrary extends Library {// 做个判断,是windos下就加载msvcrt.dll ,否则是 c.soCLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),CLibrary.class);void printf(String format, Object... args);}public static void main(String[] args) {StdCallDll.INSTANCE.printf("Hello, World!\n");CLibrary.INSTANCE.printf("Hello, World\n");}
}

JNA-Java跨平台调用的利器相关推荐

  1. vs可以调用java接口吗_关于vs2010下编译dll动态库,JNA接口在java中调用的问题

    最近在搞关于把vs2010中的project,使之能够在Java下面运行,有一个调用本地接口的问题,JNI那个涉及到复杂细节太多,就使用了最新的JNA(java native access) 网上也给 ...

  2. JNA —— Java调用C/C++动态库

    工作所需,要使用Java调用c/c++的动态库,实现Java程序使用动态库中的函数. 搜索了一番,常用的有JNI.JNA方法. JNI(Java Native Interface) JNI定义了一种公 ...

  3. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  4. java 调用 go_实践总结:在 Java 中调用 Go 代码

    在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...

  5. java动态调用c++库

    前言 最近在做一个通过java程序调用c++动态语言库,在网上百度,谷歌找了诸多例子,还是屡试不爽.经过一番折腾还是披荆斩棘,创出一条道路.希望分享给正在迷茫的朋友们... 使用的环境 spring ...

  6. Java 跨平台运行机理:Dos 命令在桌面新建文件夹,并在其中编译、运行一段 Java 程序

    文章目录 前言 一.打开 Dos 命令界面 二.Dos 查看桌面文件目录序列 三.Dos 创建文件夹 四.相关 Windows 系统 Shell 命令补充 五.Dos 进入文件夹编写 Java 文件 ...

  7. java dll 调用方法_关于Java调用dll的方法 | 学步园

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C   写好的DLL库时,由于基本数据类型不同.使用字节 ...

  8. java 静态区在jvm哪里,JDKJREJVM这三者的联系与区别///java跨平台///堆栈常量区静态区...

    JDKJREJVM这三者的联系与区别///java跨平台///堆栈常量区静态区 JDK,JRE,JVM这三者的联系与区别///java跨平台///堆.栈.常量区.静态区.方法区的区别 ---复习day ...

  9. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  10. 海康萤石摄像头SDK Java(一)java本地调用摄像头

    本文仅仅实现java 本地调用海康摄像头,后续的视频码解析正在研究. 默认环境: 1.从官网下载好对应OS的SDK. 2.连通摄像头. 3.搭建Java项目,集成sdk中的java demo. 先看效 ...

最新文章

  1. Nginx 学习笔记(二)反向代理
  2. Hive Error : Java heap space 解决方案
  3. 创建第一个IOS项目
  4. 添加别名_ssh别名免密登陆服务器
  5. python入门学习课程推荐
  6. build.gradle里repositories的mavenCentral实现原理解析
  7. java发生fullgc的时机_2021-01-02:java中,MinorGC、MajorGC、FullGC 什么时候发生?
  8. rem和css3的相关知识点
  9. 关系数据库的基本概念和MySQL说明
  10. 关于数据准备时,自动棌番的主键,这一字段数据的注意(IT总结之五)
  11. 构造一个简单的神经网络,以DQN方式实现小游戏的自动控制
  12. python-select异步IO
  13. 数据库系统概论第五版(王珊)-基础篇(一)
  14. 考上研究生就脱单?快来看看这些女生多的大学!
  15. 计算机演示文稿知识点,计算机基础知识:PowerPoint常用操作(一)
  16. 美团实习面(45min + 35min)
  17. 点击文件实现WPS工具预览功能
  18. 如何将一个HTML页面嵌套在另一个页面中
  19. 服务器集群有哪些类型
  20. 洛谷 P1460 健康的荷斯坦奶牛 Healthy Holsteins

热门文章

  1. php中的数值型字符串相加 相比较( ==)
  2. Linux入门-第四周
  3. jxl 导入导出Excel(有模板)
  4. 软件工程项目____搜查令
  5. FPGA实现“打字机”(VGA UART)
  6. sql server 按年月日分组
  7. bootstrap jasny fileinput插件冲突问题解决
  8. silverlight将字符串转化为控件
  9. springboot+mybatis+druid 多数据源整合
  10. 手机端判断触摸滑动方向