【问题标题】:JNA passing reference of array into native DLLJNA 将数组引用传递到本机 DLL
【发布时间】:2020-09-04 12:35:31
【问题描述】:

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 返回一个错误代码,说明参数错误。我很确定错误是最后一个参数。我也尝试过直接传递一个长数组或传递一个指针但没有成功。

【问题讨论】:

    标签: java jna


    【解决方案1】:

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

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

    问题很可能是为MaskSerial 指针传递的null 值。除非 API 明确指出那里允许 null,否则它们很可能应该使用 new IntByReference() 进行初始化,以便为可以在本机端填充的 int 分配本机端内存。

    虽然为 long[4] 过度分配内存不应特别导致错误,但您已为 256 数组分配了 256 字节。分配new Memory(32) 就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多