0

我的动态 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 端分配)。这通常是不安全的。

4

1 回答 1

2

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

您当然可以给出字段Pointer类型并为其分配一个Memory对象。只要本机代码不修改其值,通常会保留该字段。

于 2013-07-17T22:45:48.343 回答