使用java jna 调用第三方dll结构体传参问题
dll的方法:
BOOL NET_ECMS_XMLConfig(
LONG lUserID,
LPNET_EHOME_XML_CFG pXmlCfg,
DWORD dwConfigSize);
LPNET_EHOME_XML_CFG 是结构体:
struct{
void *pCmdBuf;
DWORD dwCmdLen;
void *pInBuf;
DWORD dwInSize;
void *pOutBuf;
DWORD dwOutSize;
DWORD dwSendTimeOut;
DWORD dwRecvTimeOut;
BYTE byRes[32];
}NET_EHOME_XML_CFG, *LPNET_EHOME_XML_CFG;
我的代码:
NET_EHOME_XML_CFG结构体对应的类:
public static class NET_EHOME_XML_CFG extends Structure {
public Pointer pCmdBuf; //字符串格式命令,参见1.2.3
public int dwCmdLen; //pCmdBuf长度
public Pointer pInBuf; //输入数据,远程配置报文公用定义
public int dwInSize; //输入数据长度
public Pointer pOutBuf; //输出缓冲<ConfigXML>
public int dwOutSize; //输出缓冲区长度
public int dwSendTimeOut; //数据发送超时时间,单位ms,默认5s
public int dwRecvTimeOut; //数据接收超时时间,单位ms,默认5s
public Pointer pStatusBuf; //返回的状态参数(XML格式),如果不需要,可以置NULL
public int dwStatusSize; //状态缓冲区大小(内存大小)
public byte[] byRes = new byte[24];
}
调用过程:
NativeLong userId=new NativeLong(0);
HCEHomeCMS.NET_EHOME_XML_CFG NET_EHOME_XML_CFG = new HCEHomeCMS.NET_EHOME_XML_CFG();
//命令
String cmd = "********";
Pointer cmdBuff = new Memory(cmd.length()+1);
cmdBuff.setString(0,cmd);
System.out.println("cmdBuff.getString="+cmdBuff.getString(0));
Pointer outBuff = new Memory(1024);
NET_EHOME_XML_CFG.pCmdBuf=cmdBuff;
NET_EHOME_XML_CFG.dwCmdLen = cmd.length();
String params = "**********";
Pointer paramsBuff = new Memory(params.length()+1);
paramsBuff.setString(0,params);
NET_EHOME_XML_CFG.pInBuf=paramsBuff;
NET_EHOME_XML_CFG.dwInSize=params.length();
NET_EHOME_XML_CFG.pOutBuf = outBuff;
NET_EHOME_XML_CFG.dwOutSize = 1024;
NET_EHOME_XML_CFG.dwSendTimeOut=10;
NET_EHOME_XML_CFG.dwRecvTimeOut=10;
NET_EHOME_XML_CFG.pStatusBuf = null;
NET_EHOME_XML_CFG.dwStatusSize=1024;
NET_EHOME_XML_CFG.byRes = "0".getBytes();
NET_EHOME_XML_CFG.write();
System.out.println("cmdBuff.getString="+cmdBuff.getString(0));
System.out.println("paramsBuff.getString="+paramsBuff.getString(0));
boolean isDown= hCEhomeCMS.NET_ECMS_XMLConfig(userId,NET_EHOME_XML_CFG,NET_EHOME_XML_CFG.size());
System.out.println("isDown="+isDown);
if (!isDown){
System.out.println("NET_ECMS_XMLConfig failed, error code:" + hCEhomeCMS.NET_ECMS_GetLastError());
}
运行返回参数错误;
我是第一次用jna,不是很懂,是不是我参数没传进去
有解答一下吗
字节对齐惹的祸?