JNA 将数组的引用传递给本机 DLL

JNA passing reference of array into native DLL

dll中的函数为:

int getInfo (
  unsigned int Index,
  unsigned int* Mask,
  unsigned int* Serial,
  unsigned __int64* licInfo);

重要的是 licInfo 是一个包含 4 个元素的数组。

在 Java 中,方法声明如下:

int getInfo(int Index, IntByReference Mask, IntByReference Serial, Memory licInfo);

方法调用:

int Index = 0;
IntByReference Mask = null;
IntByReference Serial = null;
Memory LicInfo = new Memory(256);    
int status = dll.INSTANCE.getInfo(Index, Mask, Serial, licInfo);

dll returns 一个错误代码,表示参数错误。我很确定错误是最后一个参数。我也尝试过直接传递一个长数组或传递一个指针,但没有成功。

函数映射本身看起来很正常,尽管我会在映射中用 Pointer 替换 Memory。由于 Memory 扩展了 Pointer,您仍然可以像现在一样初始化并传递值。

没有 API 文档指定它期望的参数,我必须对问题做出一些有根据的猜测。本机函数需要一个 int 和 3 个指向信息的指针,您所说的最后一个是 long 的数组。前两个预期是什么?

问题很可能是为 MaskSerial 指针传递的 null 值。除非 API 明确表示在那里允许 null,否则这些应该很可能用 new IntByReference() 初始化,以便为可以填充的 int 分配 native-side 内存原生方

虽然 long[4] 的 over-allocating 内存不应该专门导致错误,但您已经为 256 分配了 256 字节 ]位数组。分配 new Memory(32) 就足够了。