java调用dll较为常用的方式有JNA和JNI。
JNA是建立在JNI技术基础之上的一个Java类库,我们可以方便地使用java直接访问动态链接库中的函数。
原来使用JNI,必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。
而JNA提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,我们不再需要编写C动态链接库。
JNA方式较为简便。过程:
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