LibRaw结构体libraw_processed_image_t中unsigned char data[1]的JNA映射方法咨询
我正在尝试为LibRaw编写JNA包装器,但遇到了一个特殊的C结构体:
typedef struct { enum LibRaw_image_formats type; ushort height, width, colors, bits; unsigned int data_size; unsigned char data[1]; } libraw_processed_image_t;
我卡在了最后一个成员data[1]上。这看起来是一个char(字节?)数组,存储着一大块8位或16位的数据,它的大小(和布局)只有在运行时才能确定。我本来以为会看到类似void *data的写法(LibRaw的其他结构体里有用到),这种情况下JNA声明可以写成public Pointer data,然后用getByteArray或getShortArray在Java中访问数据。但LibRaw的API就是这样,我该怎么声明对应的JNA结构呢?
我曾错误地假设char data[1]和void *data的内存布局是一样的,于是在JNA里用了public Pointer data,但调用getByteArray时会报错:Error: Invalid memory access。我也试过public byte[] data = new byte[1],但这样只能访问第一个字节。我还想过用public byte[] data = new byte[SOME_BIG_NUMBER],但这看起来不太安全(哪怕能运行),因为在结构体/类实例化的时候,我还不知道数据的实际大小。
那正确的做法是什么?
更新1:
用SOME_BIG_NUMBER的方法是有效的(能正常访问数据),只要这个数值和DLL返回的数据大小完全一致。但问题在于,我只能在运行时获取数据的实际大小,而结构体/类在实例化的时候我还不知道这个值,所以这种方法还是有局限。
更新2:
我通过修改Java本地函数的声明解决了这个问题——让它返回一个Pointer而不是大小不确定的Structure(JNA似乎能接受这种写法),然后用一系列的getInt、getShort和getByteArray来动态“解析”目标结构体。我不知道这是不是最优解(甚至不知道是不是合理的解法),但目前看起来是能用的。
备注:内容来源于stack exchange,提问作者Marek P

