JNA工做筆記一

JNA是什麼?

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

JNA的簡單例子:

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,不然會提示類型錯誤。函數

相關文章
相關標籤/搜索