[普通]JNA:JAVA调用DLL 超详细代码实战

作者(passion) 阅读(1470次) 评论(0) 分类( c++)

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 参考文献

JNA下载 http://download.csdn.net/detail/gcangle/4994859

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


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:CAB发布OCX的简单办法
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img