JNA:JAVA调用DLL 超详细代码实战

Java通过JNA调用dll动态库demo并生成相应jar文件详细教程 阅读详情

0  JNA安装

0.1 JNA是什么

JNA(JavaNativeAccess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在
经典的JNI的基础之上的一个框架。
JNA项目地址:https://jna.dev.java.net/
JNA使Java调用原生函数就像.NET上的P/Invoke一样方便、快捷。
JNA的功能和P/Invoke类似,但编写方法与P/Invoke截然不同。JNA没有使用Annotation,
而是通过编写一般的Java代码来实现。
P/Invoke是.NET平台的机制。而JNA是Java平台上的一个开源类库,和其他类库没有
什么区别。只需要在classpath下加入jna.jar包,就可以使用JNA。
JNA使Java平台可以方便地调用原生函数,这大大扩展了Java平台的整合能力。

0.2 加入

在eclipse 中将文章最后的JNA下载中的zip解压放到一个记得住的文件夹然后在工程的JAVA Build Path中加入这两个jar即可



1 使用步骤

1.1 编写DLL

这里我们使用 code::blocks编写dll

首先新建一个DLL工程


建立完毕后我们可以看到这样的结构

其中有一个h文件和一个cpp文件

依葫芦画瓢 改写这两个文件就可以了,我们写两个函数,一个加一个阶乘

main.h 改写成

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

int add(int a,int b);
int factorial(int n);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp改写成

#include "main.h"

int add(int a,int b){
    return a + b;
}
int factorial(int n){
    int i;
    int r = 1;
    for(i=1;i<n+1;i++)
        r = r*i;
    return r;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

其中DLLMain是动态链接库的入口函数我们不用管它,点击编译按钮


这样就生成了DLL文件了,我们在项目文件夹 bin文件夹下的Debug中可以找到编译成了DLL文件,将这个文件拷贝到需要使用DLL的JAVA工程路径下



这样DLL文件就准备好了

1.2 编写接口类

新建一个类,实现Library接口

package implementation;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface JNATestDll extends Library {
	JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("JNATestDLL",JNATestDll.class);
	public int add(int a,int b);
	public int factorial(int n);
}

这样就可以方便的调用这一DLL了

编写一个GUI类用于展示结果

package gui;

import implementation.JNATestDll;

public class GUI {

	private JFrame frame;
	private JTextField tfb;
	private JTextField tfa;
	private JTextField tfadd;
	private JTextField tfn;
	private JTextField tffactorial;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GUI window = new GUI();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public GUI() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JButton bntcompute = new JButton("compute");
		bntcompute.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tfadd.setText(""+JNATestDll.instanceDll.add(Integer.valueOf(tfb.getText()), Integer.valueOf(tfa.getText())));
				tffactorial.setText(""+JNATestDll.instanceDll.factorial(Integer.valueOf(tfn.getText())));
			}
		});
		bntcompute.setBounds(286, 180, 93, 23);
		frame.getContentPane().add(bntcompute);
		
		tfb = new JTextField();
		tfb.setText("3");
		tfb.setBounds(171, 111, 66, 21);
		frame.getContentPane().add(tfb);
		tfb.setColumns(10);
		
		tfa = new JTextField();
		tfa.setText("2");
		tfa.setBounds(74, 111, 66, 21);
		frame.getContentPane().add(tfa);
		tfa.setColumns(10);
		
		tfadd = new JTextField();
		tfadd.setEditable(false);
		tfadd.setBounds(286, 111, 66, 21);
		frame.getContentPane().add(tfadd);
		tfadd.setColumns(10);
		
		tfn = new JTextField();
		tfn.setText("10");
		tfn.setBounds(74, 142, 66, 21);
		frame.getContentPane().add(tfn);
		tfn.setColumns(10);
		
		tffactorial = new JTextField();
		tffactorial.setEditable(false);
		tffactorial.setBounds(286, 142, 66, 21);
		frame.getContentPane().add(tffactorial);
		tffactorial.setColumns(10);
	}
}

OK一切就绪!

2 测试

运行程序


我们可以看到 DLL已经成功的工作了

相信大家已经学会如何用了吧!

3 参考文献

JNA下载 http://download.youkuaiyun.com/detail/gcangle/4994859

文档下载 http://download.youkuaiyun.com/detail/gcangle/4996663

或者 http://download.youkuaiyun.com/detail/liuyuegui/4608005 呵呵~

看完后评论是美德~

可以加QQ 993830638讨论 ,很高兴能帮助你!

java使用JNA调用dll踩的坑 原文:https://www.cnblogs.com/wyongbo/p/jnaTest.html 因原文,有些点讲的不是非常的清楚,本人C#以及C#开发工具VS也不是非常的熟悉。因此坑了一下午,下面记录一下遇到的一些坑。 一、环境 开发工具:Visual Studio2019、Eclipse SDK:jdk8-x64 二、准备工作 JNA下载 提取码: wd6v 三、入坑 生成C#DLL ... 阅读详情

相关推荐

Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll

Android 通过 JNA 调用 Clang 3.6或者GCC4.9编译的 x86 arm等结果的so库,以及C#使用dllimport在 Window x64 平台调用32位 C/C++ 动态链接库,Java在Windows x64平台通过JNA调用64位 C/C++动态链接库

qq_694060865的博客 4159

java-调用dll方法

由于需求需要添加一个USB狗,作为服务的license验证。则Java程序需要和dll进行整合。该USB狗已经提供了Java版本的dll,需要自己编写class,载入dll,并声明方法才能够使用。

weixin_43846708的博客 7750

JAVA使用JNA调用DLL(VS2019创建DLL文件)

JAVA使用JNA调用DLL(VS2019创建DLL文件) 创建DLL 前提:安装好了Visual Studio(安装地址:https://visualstudio.microsoft.com/zh-hans/) 1.1 打开应用,创建新项目 1.2 选择 具有导出项的(DLL)动态链接库 1.3 填写项目名称,选择存放地址 1.4编写代码 头文件.h为声明宏,结构体,函数的代码 源文件.c(.cpp)为实现函数代码 pch.h代码: // pch.h: 这是预编译标头文件。 // 下方列出的文件仅

是十月张的博客啊 1319

利用jna调用dll(史上最全)

利用jna调用dll(史上最全)内容说明jna介绍用到的工具及资料dll中的内容java中利用jna模拟dll中的结构体(利用接口中的内部类模拟)调用dll主程序利用jna调用dll需要注意的问题总结 内容说明 本文主要是我在做项目中,甲方用的java开发的平台,我们写算法嵌入到他们的系统中,本来以为直接用java写就OK了,可是他们要求用c++写说速度快(说实话只要不操作硬件,现在的java虚拟机运行java和c++的执行效率几乎一样)(没办法,只能使用java调用c++生成的dll),这里就不赘述生成d

weixin_44413832的博客 1万+

如何在Java中调用DLL:详细图解

首先,我们准备了DLL文件,并创建了一个Java项目。然后,我们导入了JNI库,并编写了Java代码来调用DLL方法。最后,我们编译并运行了Java程序,成功实现了Java与DLL的交互。在开始之前,确保已经设置好Java开发环境,并创建一个Java项目。在Java开发中,有时候需要与动态链接库(DLL)进行交互,以实现更高级的功能。在本例中,我们将使用Java来调用已经编写好的DLL。通过本文的指导,你可以在Java中轻松地调用DLL,并利用DLL的功能扩展你的Java应用程序。第一步:准备DLL文件。

CyberXZ的博客 5131

Java语言调用dll文件的几种常见方式

java调用动态库需要关注的问题: 1. 如何装载DLL文件,以及如何定位所要使用的方法; 2. 数据类型如何对应; 3. 如何给使用的方法传递参数; 4. 如何获取返回的值。 一. 数据类型对应关系 Java Type C Type boolean int byte char char wchar_t sho...

专注基础架构领域 6231

【JNA】JAVA使用JNA调用C++ dll文件(1)创建C++代理层

JAVA调用C++ 的DLL文件的方式主要有JNA和JNI两种,其中JNA使用较为简单。 因DLL文件是给C++程序调用的,所以里面的函数不一定全部都暴露了,可以通过使用 VS studio编写dll代理层的方式,将原始dll文件中的函数重新暴露出来,以便让JNA可以调用到。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 1136

JNA调用Dll传参异常,如何解决?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1206

java调用dll 释放dll 随调随关 之 JNA 操作

本文采用JNA调用DLL note:个人尝试过JNI,Jnative,等其他调用方式.总而言之 繁琐,不适合Java吧.或者不适合小编,这里只推荐JNA,核心代码三行搞定调用DLL. jnative好用,但是文件路径等等还是有问题,不能像java一样去使用。也不推荐 jna调用,意外之喜很好用的。貌似是对Jnative进行了封装.可以自行研究一下,之前研究的 忘了… . step1 JNA Mav...

站在风口上的猪 4233

Java通过JNA调用DLL的实践教程

Java Native Access (JNA) 是一个开源的Java库,它提供了与本地共享库进行交互的简便方式,而无需编写单独的本地代码。在本章中,我们将介绍JNA的基本概念,并探讨使用它带来的优势。JNA允许Java程序直接访问操作系统上运行的本地动态链接库(DLLs,Windows系统)或共享库(.so文件,类Unix系统)。这意味着Java应用能够调用本地库中的函数、方法和属性,就像在本地语言中编写的一样。

weixin_42602726的博客 1179

JNA实现Java与C# DLL交互实战

在现代软件开发领域,跨语言的接口调用一直是技术人员致力于解决的挑战之一。Java Native Access (JNA) 提供了一种简洁而强大的方法,以透明的方式直接从Java代码中调用本地共享库的函数,无需编写任何JNI代码。本章将详细介绍JNA的概念、发展历程以及它的核心优势。JNA是一个开源库,允许Java代码调用动态链接库(DLL)中的函数,而无需编写JNI(Java Native Interface)封装代码。它通过一个简单的接口描述机制,能够自动解析和绑定本地库中的函数和数据结构。

weixin_42573757的博客 1154

Java使用JNA调用SWMM模型的DLL

Java使用JNA调用SWMM模型的DLL1、对于SWMM我了解的不多,只知道是干嘛什么的。2、Java简单使用JNA。2.1、添加JNA依赖2.2、HelloWorld3、仿照C程序读取DLL3.1、Swmm5_iface3.1、Java调用DLL 1、对于SWMM我了解的不多,只知道是干嘛什么的。 SWMM(storm water management model,暴雨洪水管理模型)是一个动态...

好记性不如烂笔头 2606

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd .

weixin_51484067的博客 2640

Java-JNA框架调用dll动态库实例

Java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的,一般情况下开发人员选用JNA即可 JNA 使用JNA框架调用DLL动态库,步骤如下: 1.引入添加jna-x.x.x.jar、jna-platform-x.x.x.jar,最新的版本的是5.5.0 <dependency> <groupId>...

年少青山的博客 2552

FIFO Generate IP核使用——FIFO写操作详解及Status Flags页配置

本文介绍了FIFO的写操作及Status Flags页的配置信息。

u011565038的博客 2285

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 319

Java 使用JNA 调用dll动态库文件

Java 调用 DLL 无非三种方法:JNI、JNA、JNative 1 JNA是什么 JNA(JavaNativeAccess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在 经典的JNI的基础之上的一个框架。 JNA项目地址:https://jna.dev.java.net/ JNA使Java调用原生函数就像.NET上的P/Invoke一样方便、快捷。 JNA的功能和P/Invoke类似,但编写方法与P/Invoke截然不同。JNA没有使用Annotation, 而是通过编写一般...

HOXEHF的博客 2006

反应动力学仿真软件:CHEMKIN_(12).CHEMKIN与其他软件的接口

通过上述介绍,我们详细探讨了如何将 CHEMKIN 与 MATLAB、Python、COMSOL、Aspen Plus 和 Ansys Fluent 等软件工具进行接口配置和数据交互。这些接口不仅能够显著提升 CHEMKIN 在反应动力学仿真中的应用效果,还能充分利用其他软件工具的强大功能,实现更复杂的数据处理和分析。希望这些内容对您在化学反应动力学仿真中的工作有所帮助。

kkchenjj的博客 1138

JNA调用DLL

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

哇哇哇js 5202

RK3568平台(camera篇)点亮imx586摄像头

mipi摄像头硬件确认点:1.供电:5V,2.8V,1.2V,1.8V,reset脚(硬拉3.3,上电的时候从低到高),pwron脚外接3.3V。2,时钟:MCLKOUT是24兆时钟。3.4组差分mipi线。mipi的data线的波形为方波。

weixin_49303682的博客 7258
上一篇: eclipse:自动提示
下一篇: Java:传值传引用的问题
gcangle
博客等级 码龄16年 41粉丝 36原创
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值