这段时间通过jna框架搞java调用dll的函数的程序,并且涉及到了回调函数,回调函数即dll传给java参数,由java来处理这些参数,一般的c++封装的dll文件涉及的回调函数参数有String和int,很少有涉及字节数组,而这次的项目需求是通过dll的函数建立ip及端口号的连接,并收取字节数组的数据,收到之后交由java实现的回调函数进行处理。c++表示字节数组一般为BYTE *,如果在java的回调函数参数对应声明byte[],则会提示错误。经过查询资料终于发现解决方法。如下所示。
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
import com.sun.jna.ptr.ByteByReference;
public class dllTest{
public interface ccback extends StdCallCallback {
public void MessageHandle(ByteByReferance buf, int length); //第一个参数为字节指针的获取
}
}
接下来需要接口实现,如下所示。
public class dllTest{
public static class MessageHandle_Realize implements ccback{
public void MessageHandle(ByteByReferance buf, int length) {
byte[] b = buf.getPointer().getByteArray(0,length); //此处为通过字节指针获取指定长度的字节数组
}
}
}
在jna中,正是通过ByteByReferance来表示BYTE类型的指针,只不过在接口实现时需要通过获得的指针的地址来取得指定长度的字节数组。
以上内容只是现学现卖,jna还有好多没有用到的方法,以后用到会随时总结。