我的动态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);
/* .... */
}
我以为一个有内存字段的结构就可以了,
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
对象。只要本地代码不修改其值,该字段通常会被保留。