1 回答
TA贡献1875条经验 获得超5个赞
1 - JNA 映射
映射旨在直接将 Java 端类型与相应的本机端类型相关联。当这些映射所需的内存众所周知时,JNA 工作得很好。不幸的是,当要映射的本机内存量是可变的时,这需要一些工作来分配和映射所需的本机内存。有几种方法可以做到这一点,具有不同的抽象/控制级别。
2 - 已经有 QueueInfo[](第 1 部分)
以您QueueInfo
在问题中定义的方式,它没有帮助。您只定义了一个 Java 端类,但Pointer
该类暗示了一个本机内存指针。您应该修改您的类以在您的领域扩展Structure
和使用。请注意,实例化此结构只会为和分配本机内存。数组本身的内存需要单独分配。 public
count
int
Pointer
3 - 分配浮点数组
正如我在评论中提到的,这样做的一种方法是为浮点数组分配本机内存:
Memory buffer = new Memory(count * Native.getNativeSize(Float.TYPE));
然后假设您已经float[] buf
定义,您可以使用将其复制到本机内存中
buffer.write(0L, buf, 0, count);
然后,您可以将其buffer
用作实例 的priorities
字段。QueueInfo
2 - 已经有 QueueInfo[](第 2 部分)
现在问题来了,除非您知道您有一个连续的 C 端数组,否则您不能只将指针设置为第一个元素。您的选择是使用Structure::toArray
分配内存(然后填充每个元素)或单独创建(连续)指针数组并Pointer
从单独分配的结构中复制值。对于toArray
变体,如果直接在生成的数组中设置值,则不需要指针构造函数,但指针构造函数可以使复制(从一个本机内存块到另一个)更容易。
概括
选项 1:使用浮点数组的方法实例化单独QueueInfo
的结构。Pointer.write()
创建一个构造函数可能会有所帮助,该构造函数将float[]
用作参数并如上所述设置count
并分配和设置变量。然后,为结构创建一个 spriorities
数组并复制每个元素的引用指针。Pointer
CreateInfo
选项 2:创建Structure::toArray
用于分配本机内存的结构数组;然后迭代这个结构并直接QueueInfo
在适当的索引处创建结构。
添加回答
举报