我试图调用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;
答案 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 。让我知道它是否已解决。