java - ProJNA 数据类型映射

标签 java jna

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

我正在尝试通过 JNA 使用 Java 的 native dll。我对 Java 和 JNA 都很陌生。对于对 dll 导出函数之一的特定调用,它返回无效参数。

这是结构,

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

typedef struct {
UNUM32 BusTypeId; 
UNUM32 ProtocolId;
UNUM32 NumPinData;
PDU_PIN_DATA *pDLCPinData;
} PDU_RSC_DATA;

这就是 PDU_PIN_DATA 结构的样子,

typedef struct {
UNUM32 DLCPinNumber; 
UNUM32 DLCPinTypeId; 
} PDU_PIN_DATA;

对应的JNA映射,

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();
}

}

native 方法 -> 已修改以方便阅读,

int _methodXYZ(PDU_RSC_DATA* obj);

Java 调用 -> 仅显示所需的代码片段,

PDU_RSC_DATA obj = new PDU_RSC_DATA();
_methodXYZ(obj);

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

最佳答案

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

编辑 JNA 默认使用结构指针作为函数参数,并在结构中默认使用值结构。为了获得互补的行为,请分别使用 Structure.ByValueStructure.ByReference

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

关于java - ProJNA 数据类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754490/

相关文章:

java - 使用 Spring Boot Rest API 的非典型 JSON 配置

java - 如果在 JSF 中有条件

java - C 等效 Java JNA 代码示例

java - JNA、映射和指针引用

java - 翻转十六进制字符串

java - Servlet 方法没有被调用?

java - JPA 实体连接组合键上的列,日期作为 PK 之一

java - 多次调用后从 native 代码调用 JAVA 回调方法时的 SIGSEGV

java - C++ 二进制到 Java 得到 "java.lang.Error: Invalid memory access"

java - 从java中的c++/c#程序读取共享内存