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

标签 java c++ jna

我正在尝试调用 dll 文件中存在的 C++ 函数,C++ 函数将结构对象作为参数,函数将为它赋值。 我正在通过 Java native 调用使用它,我的程序在下面,

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;

最佳答案

在 C++ 中,在结构中声明的静态长度数组被内联到结构中。所以你的 C++ 代码在结构上大致等同于:

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

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

关于java - 将 C++ 结构映射到 Java 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52556758/

相关文章:

c++ - 我无法使用 fstream 读取 .dat 文件

java - 使用 Java JNA 捕获 Win32 事件

java - 如何访问输出参数值

java - 无法从更新的 org.json 包中导入类

c++ - 为目录创建文件映射

c++ - 为什么 qt 在 opengl 中渲染 svg 文件时比在原生中有更好的性能

java - 使用 Java jna 和 FFTW3 包装器获取 malloc 错误

java - 如何使用ArrayList存储多行信息?

java - Android SetText 在 OkHttp 异步回调中导致崩溃

Java : Unknown error in exception handling