JAVA调用DLL 超详细代码实战

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 改写成

[cpp]  view plain  copy
  1. #ifndef __MAIN_H__  
  2. #define __MAIN_H__  
  3.   
  4. #include <windows.h>  
  5.   
  6. /*  To use this exported function of dll, include this header 
  7.  *  in your project. 
  8.  */  
  9.   
  10. #ifdef BUILD_DLL  
  11.     #define DLL_EXPORT __declspec(dllexport)  
  12. #else  
  13.     #define DLL_EXPORT __declspec(dllimport)  
  14. #endif  
  15.   
  16.   
  17. #ifdef __cplusplus  
  18. extern "C"  
  19. {  
  20. #endif  
  21.   
  22. int add(int a,int b);  
  23. int factorial(int n);  
  24.   
  25. #ifdef __cplusplus  
  26. }  
  27. #endif  
  28.   
  29. #endif // __MAIN_H__  

main.cpp改写成

[cpp]  view plain  copy
  1. #include "main.h"  
  2.   
  3. int add(int a,int b){  
  4.     return a + b;  
  5. }  
  6. int factorial(int n){  
  7.     int i;  
  8.     int r = 1;  
  9.     for(i=1;i<n+1;i++)  
  10.         r = r*i;  
  11.     return r;  
  12. }  
  13.   
  14. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)  
  15. {  
  16.     switch (fdwReason)  
  17.     {  
  18.         case DLL_PROCESS_ATTACH:  
  19.             // attach to process  
  20.             // return FALSE to fail DLL load  
  21.             break;  
  22.   
  23.         case DLL_PROCESS_DETACH:  
  24.             // detach from process  
  25.             break;  
  26.   
  27.         case DLL_THREAD_ATTACH:  
  28.             // attach to thread  
  29.             break;  
  30.   
  31.         case DLL_THREAD_DETACH:  
  32.             // detach from thread  
  33.             break;  
  34.     }  
  35.     return TRUE; // succesful  
  36. }  

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


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



这样DLL文件就准备好了

1.2 编写接口类

新建一个类,实现Library接口

[java]  view plain  copy
  1. package implementation;  
  2.   
  3. import com.sun.jna.Library;  
  4. import com.sun.jna.Native;  
  5.   
  6. public interface JNATestDll extends Library {  
  7.     JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("JNATestDLL",JNATestDll.class);  
  8.     public int add(int a,int b);  
  9.     public int factorial(int n);  
  10. }  

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

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

[java]  view plain  copy
  1. package gui;  
  2.   
  3. import implementation.JNATestDll;  
  4.   
  5. public class GUI {  
  6.   
  7.     private JFrame frame;  
  8.     private JTextField tfb;  
  9.     private JTextField tfa;  
  10.     private JTextField tfadd;  
  11.     private JTextField tfn;  
  12.     private JTextField tffactorial;  
  13.   
  14.     /** 
  15.      * Launch the application. 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         EventQueue.invokeLater(new Runnable() {  
  19.             public void run() {  
  20.                 try {  
  21.                     GUI window = new GUI();  
  22.                     window.frame.setVisible(true);  
  23.                 } catch (Exception e) {  
  24.                     e.printStackTrace();  
  25.                 }  
  26.             }  
  27.         });  
  28.     }  
  29.   
  30.     /** 
  31.      * Create the application. 
  32.      */  
  33.     public GUI() {  
  34.         initialize();  
  35.     }  
  36.   
  37.     /** 
  38.      * Initialize the contents of the frame. 
  39.      */  
  40.     private void initialize() {  
  41.         frame = new JFrame();  
  42.         frame.setBounds(100100450300);  
  43.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  44.         frame.getContentPane().setLayout(null);  
  45.           
  46.         JButton bntcompute = new JButton("compute");  
  47.         bntcompute.addActionListener(new ActionListener() {  
  48.             public void actionPerformed(ActionEvent e) {  
  49.                 tfadd.setText(""+JNATestDll.instanceDll.add(Integer.valueOf(tfb.getText()), Integer.valueOf(tfa.getText())));  
  50.                 tffactorial.setText(""+JNATestDll.instanceDll.factorial(Integer.valueOf(tfn.getText())));  
  51.             }  
  52.         });  
  53.         bntcompute.setBounds(2861809323);  
  54.         frame.getContentPane().add(bntcompute);  
  55.           
  56.         tfb = new JTextField();  
  57.         tfb.setText("3");  
  58.         tfb.setBounds(1711116621);  
  59.         frame.getContentPane().add(tfb);  
  60.         tfb.setColumns(10);  
  61.           
  62.         tfa = new JTextField();  
  63.         tfa.setText("2");  
  64.         tfa.setBounds(741116621);  
  65.         frame.getContentPane().add(tfa);  
  66.         tfa.setColumns(10);  
  67.           
  68.         tfadd = new JTextField();  
  69.         tfadd.setEditable(false);  
  70.         tfadd.setBounds(2861116621);  
  71.         frame.getContentPane().add(tfadd);  
  72.         tfadd.setColumns(10);  
  73.           
  74.         tfn = new JTextField();  
  75.         tfn.setText("10");  
  76.         tfn.setBounds(741426621);  
  77.         frame.getContentPane().add(tfn);  
  78.         tfn.setColumns(10);  
  79.           
  80.         tffactorial = new JTextField();  
  81.         tffactorial.setEditable(false);  
  82.         tffactorial.setBounds(2861426621);  
  83.         frame.getContentPane().add(tffactorial);  
  84.         tffactorial.setColumns(10);  
  85.     }  
  86. }  

OK一切就绪!

2 测试

运行程序


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

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

3 参考文献

文档下载:链接:https://pan.baidu.com/s/18FL6DcH9Rl2wpaEQZ2AF_g 密码:4eok

转载至https://blog.csdn.net/gcangle/article/details/8504629

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页