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
的数组。前两个预期是什么?
问题很可能是为 Mask
和 Serial
指针传递的 null
值。除非 API 明确表示在那里允许 null
,否则这些应该很可能用 new IntByReference()
初始化,以便为可以填充的 int
分配 native-side 内存原生方
虽然 long[4]
的 over-allocating 内存不应该专门导致错误,但您已经为 256 分配了 256 字节 ]位数组。分配 new Memory(32)
就足够了。
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
的数组。前两个预期是什么?
问题很可能是为 Mask
和 Serial
指针传递的 null
值。除非 API 明确表示在那里允许 null
,否则这些应该很可能用 new IntByReference()
初始化,以便为可以填充的 int
分配 native-side 内存原生方
虽然 long[4]
的 over-allocating 内存不应该专门导致错误,但您已经为 256 分配了 256 字节 ]位数组。分配 new Memory(32)
就足够了。