JNA(Java Native Access )提供一組Java工具類用於在運行期動態訪問系統本地庫(native library:如Window的dll)而不須要編寫任何Native/JNI代碼。開發人員只要在一個java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。說直白點就是能讓你調用底層的dll類庫,諸如(C++,C,VC++)寫的dll類庫。具體詳細的幫助文檔你們也能夠參考JNA的託管地址:https://github.com/java-native-access/jnajava
C代碼大體定義:git
接下來,咱們新建一個maven項目,加入jna的依賴:github
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>4.2.1</version> </dependency>
接下來,咱們要定義和C同樣的數據結構體,函數,首先先看一下官方給的對應的數據類型:
數組
這是JNA官方給出的一份,C類型映射成java類型的一個列表。咱們首先將test.dll放入maven項目的resouces目錄下面,接着定義一個C裏面的結構體映射成java的結構體代碼:數據結構
/** * 定義一個結構體 * Created by lby on 2015/12/13 0013. */ public class TestStructure extends Structure { public int offset; public short port; public char protocol; public long Receivebytes; public byte[] Domain = new byte[300]; @Override protected List getFieldOrder() { return Arrays.asList(new String[]{"offset","port","protocol","Receivebytes","Domain"}); } }
映射C的函數:maven
import com.sun.jna.Library; import com.sun.jna.Native; /** * Created by lby on 2015/12/13 0013. */ public class JNATest1 { public interface TestJNA extends Library{ //引入dll類庫 TestJNA TEST_JNA = (TestJNA) Native.loadLibrary("test", TestJNA.class); /** * str爲輸入參數,len爲輸出參數,輸出str的長度 * @param str 輸入參數:str * @param len 輸出參數:len */ public void test1(String str,int len); /** * iBegin爲輸入參數,aArray爲輸出參數,數組名,iArrayLen爲輸入參數,數組長度。返回的數組裏面第一個元素值爲iBegin,並依次遞增1 * @param iBegin * @param aArray * @param iArrayLen */ public void test2(int iBegin,int[]aArray,int iArrayLen); /** * 最後一個爲輸出參數,將各個字段值分別賦值 * @param iOffset * @param sPort * @param cProtocol * @param llRecvBytes * @param cDomain * @param pResult */ public void test3(int iOffset, short sPort, byte cProtocol, long llRecvBytes, String cDomain, TestStructure pResult); } }
接着,咱們就寫個測試類:ide
能夠看到成功調用了。因爲int *表明的是一個引用類型,因此要定義成IntByReference,不然會提示類型錯誤。函數