gpt4 book ai didi

java - 在 JNA 中传递带有内存字段的结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:55 24 4
gpt4 key购买 nike

我的动态 C 库接收一些(指向)结构,其中包括一个分配的指针(通过 malloc)。允许调用的函数对其调用 realloc

typedef struct mystruct {
void * buf;
int buflen;
/* more fields... */
} mystruct;


void myfunc(mystruct *s1, /* more args*/) { /* in dynamic library */
/* .... */
s1->buf = realloc(s1->buf,newsize);
/* .... */
}

我认为一个带有 Memory 的结构字段就可以了,

public class MyStructJna extends Structure {
public Memory buf;
public Integer buflen;
/* .... */
}

但后来我得到了这个异常:

Exception in thread "main" java.lang.IllegalArgumentException: 
Structure field "buf" was declared as class com.sun.jna.Memory,
which is not supported within a Structure
at com.sun.jna.Structure.writeField(Structure.java:792)

任何解释和/或解决方法?我正在使用 JNA 4.0


问题已得到回答并被接受,但我想添加这个警告,以防有人尝试类似的方法:

这不是一个好的设计,因为 DLL 端将重新分配在 JNA 端分配的指针,最后,JNA 端将尝试释放该指针(在 DLL 端分配)。这通常是不安全的。

最佳答案

您不能使用 Memory因为 JNA 必须能够自动初始化结构的所有字段。

你当然可以给字段Pointer输入并分配 Memory反对它。只要 native 代码不修改其值,该字段通常会被保留。

关于java - 在 JNA 中传递带有内存字段的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17710349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com