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代码大致定义:
接下来,我们新建一个maven项目,加入jna的依赖:
<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的函数:
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);
}
}
接着,我们就写个测试类:
可以看到成功调用了。由于int *代表的是一个引用类型,所以要定义成IntByReference,否则会提示类型错误。
来源:oschina
链接:https://my.oschina.net/u/1471190/blog/547598