JNA方式呼叫dll動態庫
阿新 • • 發佈:2019-01-07
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