我的动态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端分配)。这通常是不安全的。
答案 0 :(得分:2)
您无法使用Memory
,因为JNA必须能够自动初始化结构的所有字段。
您当然可以提供字段Pointer
类型并为其分配Memory
个对象。只要本机代码不修改其值,通常会保留该字段。