Fork me on GitHub

JNA方式调用dll动态库

背景

之前有段时间写了个GUI,调用公司CA服务器相关接口,进行两码获取、证书下载等操作,证书下载需要借助动态链接库等控件进行,故有如下内容

JNA是什么

java调用dll较为常用的方式有JNA和JNI。

JNA是建立在JNI技术基础之上的一个Java类库,我们可以方便地使用java直接访问动态链接库中的函数。

原来使用JNI,必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。
而JNA提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,我们不再需要编写C动态链接库。

怎么用

过程:
1、引入JNA.jar
2、声明接口(注意和动态库方法数据类型的映射关系)
3、调用声明的接口中的方法
调用时需要注意dll的位置:
    方式一:把动态库拷贝到system32目录
    方式二:
    String path = ESAMServer.class.getResource("/").getPath()+"/dll";
    System.load(path+"/MyNative.dll");
    NativeLibrary.addSearchPath("MyNative.dll", path); 

测试代码

JComboBoxTest.java

package TestNativeLibrary;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class JComboBoxTest {
    private JFrame frame = new JFrame("JComboBoxTest");
    private JPanel panel1 = new JPanel(new BorderLayout());
    private JComboBox JComboBoxT = new JComboBox();
    private JTextArea JTextAreaT = new JTextArea();

    public JComboBoxTest(){
        JNATest jc = JNATest.instanceDll;
        frame.setLayout(null);
        frame.setLayout(new GridLayout(1,1));
        frame.setVisible(true);
        frame.setBounds(400, 250, 200, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComboBoxT.setModel(new DefaultComboBoxModel(jc.rsa_csp_listProvider()));
        frame.add(panel1);
        panel1.add("North",JComboBoxT);
        panel1.add("Center",JTextAreaT);    
    }

    public static void main(String args[]){
        new JComboBoxTest();
    }
}

JNATest.java

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

public interface JNATest extends Library {  
    public JNATest instanceDll = (JNATest)Native.loadLibrary("SKFCSPEnroll", JNATest.class);  
    public String[] rsa_csp_listProvider();  
}

附:

参考:

http://blog.csdn.net/hengwei_vc/article/details/6982076

http://blog.chinaunix.net/uid-29308108-id-4048576.html

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%