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,不然会提示类型错误。函数