将C ++结构映射到Java结构

时间:2018-09-28 13:44:48

标签: java c++ jna

我试图调用dll文件中存在的C ++函数,C ++函数将结构对象作为参数,并且函数将为其分配值。 我正在通过Java本机调用来使用它,而我的程序在下面,

public class WTS_CLIENT_ADDRESS extends Structure {
    public static class ByReference extends WTS_CLIENT_ADDRESS implements Structure.ByReference {

    }
public int AddressFamily;

public byte[] Address = new byte[20];

public WTS_CLIENT_ADDRESS() {
}

public WTS_CLIENT_ADDRESS(Pointer p) {
    super(p);
}

public byte[] getByteArray() {
    return Address;
}

@Override
protected List getFieldOrder() {
    return Arrays.asList("AddressFamily", "Address");
}
} 

我正确获取了AddressFamily的值,但没有正确获取Address的值。在c ++中的字节数组和所定义的java结构字节数组之间的数据结构中似乎出现了问题。有帮助吗?

它的C ++结构是

typedef struct _WTS_CLIENT_ADDRESS {
  DWORD AddressFamily;
  BYTE  Address[20];
} WTS_CLIENT_ADDRESS, *PWTS_CLIENT_ADDRESS;

2 个答案:

答案 0 :(得分:1)

在C ++中,将在结构中声明的静态长度数组内联到该结构中。因此,您的C ++代码在结构上大致等同于:

typedef struct _WTS_CLIENT_ADDRESS {
  DWORD AddressFamily;
  BYTE Address1;
  BYTE Address2;
  // ...
  BYTE Address20;
} WTS_CLIENT_ADDRESS;

据我所知,这是在Java中映射Address的唯一方法,因为从Java数组到C ++数组字段没有更好的映射。请注意,这与函数中的C ++数组参数不同,后者基本上是指针,因此可以正常工作。

答案 1 :(得分:0)

如果您将单个字节传递给Java怎么办?存在两个可能的问题:数组类型,或者可能两者都有。如果可以毫无问题地将单个字节传递给Java,则尝试使用 BYTE * Address 而不是 BYTE Address [] 。如果没有帮助,请尝试传递一个字符数组,而不是字节 char Address [] char * Address 。让我知道它是否已解决。