背景
之前有段时间写了个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();
}
附:
参考: