1. 程式人生 > >JNA方式呼叫dll動態庫

JNA方式呼叫dll動態庫

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