首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ProJNA数据类型映射

ProJNA数据类型映射
EN

Stack Overflow用户
提问于 2012-10-05 21:46:55
回答 2查看 287关注 0票数 1

下面的问题已经被修改以缩小范围,

我试图使用JNA使用Java中的本机dll。我对Java和JNA都很陌生。对于对dll导出函数之一的特定调用,它返回无效参数。

这是结构体,

PDU_RSC_DATA是一个引用另一个结构PDU_PIN_DATA的结构,

代码语言:javascript
复制
typedef struct {
UNUM32 BusTypeId; 
UNUM32 ProtocolId;
UNUM32 NumPinData;
PDU_PIN_DATA *pDLCPinData;
} PDU_RSC_DATA;

这就是PDU_PIN_DATA结构的样子,

代码语言:javascript
复制
typedef struct {
UNUM32 DLCPinNumber; 
UNUM32 DLCPinTypeId; 
} PDU_PIN_DATA;

对应的JNA映射,

代码语言:javascript
复制
public class PDU_RSC_DATA extends Structure{ 

public int BusTypeId; 
public int ProtocolId; 
public int NumPinData; 
public Pointer pDLCPinData; 

}

public class PDU_PIN_DATA extends Structure implements Structure.ByReference{

public int DLCPinNumber;
public int DLCPinTypeId;

public PDU_PIN_DATA(){

}

public PDU_PIN_DATA(Pointer ptr_PDU_PIN_DATA) {
    super(ptr_PDU_PIN_DATA);
    read();
}

}

本机方法->为便于阅读而修改,

代码语言:javascript
复制
int _methodXYZ(PDU_RSC_DATA* obj);

Java调用->只显示所需的片段,

代码语言:javascript
复制
PDU_RSC_DATA obj = new PDU_RSC_DATA();
_methodXYZ(obj);

请告诉我上面对struct*的映射是否正确。从DLL日志中,我注意到PDU_PIN_DATA pDLCPinData的值无效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-08 22:16:42

DLL规范不正确。PDU_PIN_DATA *pDLCPinData是指向结构数组的指针,而不是指向结构的指针。这就是为什么科技公司的建议在起作用。从我的角度来看,这是个问题。再次感谢技术.

下面是如何将值赋值给struct数组,它工作得很好。我在问题中也修改了PDU_RSC_DATA结构。

代码语言:javascript
复制
    PDU_RSC_DATA pRscData = new PDU_RSC_DATA();
    pRscData.BusTypeId = 1;
    pRscData.ProtocolId = 7;
    pRscData.NumPinData = 2; 

    PDU_PIN_DATA pDLCPinData = new PDU_PIN_DATA();

    PDU_PIN_DATA[] pDLCPinDataArray= (PDU_PIN_DATA[])pDLCPinData.toArray(pRscData.NumPinData);

    pDLCPinDataArray[0].DLCPinNumber = 6;
    pDLCPinDataArray[0].DLCPinTypeId = 1;
    pDLCPinDataArray[1].DLCPinNumber = 14;
    pDLCPinDataArray[1].DLCPinTypeId = 2;

    pDLCPinData.autoWrite();

    Pointer ptr_pDLCPinData = pDLCPinData.getPointer();
    pRscData.pDLCPinData = ptr_pDLCPinData;
票数 0
EN

Stack Overflow用户

发布于 2012-10-06 12:44:10

对本机NativeLong类型使用int (或Windows上的int)。Java long是64位,这肯定不是您想要的。

编辑 JNA在默认情况下对函数参数使用结构指针,在结构中默认使用值结构。为了得到互补行为,分别使用Structure.ByValueStructure.ByReference

如果您的结构字段是指针,请使用实现Structure.ByReference的结构版本。JNA通常会在本机调用之前和之后自动将本机内存同步到java字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12754490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档