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/jna

JNA的简单例子:

C代码大致定义:

JNA学习笔记一_第1张图片

接下来,我们新建一个maven项目,加入jna的依赖:

<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna</artifactId>
  <version>4.2.1</version>
</dependency>

接下来,我们要定义和C一样的数据结构体,函数,首先先看一下官方给的对应的数据类型:

JNA学习笔记一_第2张图片

这是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的函数:

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);

    }

}

接着,我们就写个测试类:

JNA学习笔记一_第3张图片

可以看到成功调用了。由于int *代表的是一个引用类型,所以要定义成IntByReference,否则会提示类型错误。

JNA学习笔记一_第4张图片

你可能感兴趣的:(java,JNA)