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

1 篇文章 0 订阅

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.csdn.net/detail/gcangle/4994859

文档下载 http://download.csdn.net/detail/gcangle/4996663

或者 http://download.csdn.net/detail/liuyuegui/4608005 呵呵~

看完后评论是美德~

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

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值