Борьба с обертками JNA за указатели данных изображения LibrawJAVA

Программисты JAVA общаются здесь
Anonymous
 Борьба с обертками JNA за указатели данных изображения Libraw

Сообщение Anonymous »

Справочная информация: я не профессиональный разработчик - я использовал C несколько десятилетий назад и Java несколько лет назад. Я ржаво. , ширина изображения/высота не является проблемой).
Соответствующий бит файла libraw_types.h:
typedef struct
{
ushort (*image)[4];
libraw_image_sizes_t sizes;

/*
Other members
*/

libraw_rawdata_t rawdata;
void *parent_class;
} libraw_data_t;

typedef struct
{
void *raw_alloc;
ushort *raw_image;
ushort (*color4_image)[4];
ushort (*color3_image)[3];

/*
Other members
*/

} libraw_rawdata_t;
< /code>
в c это обычно используется следующим образом: < /p>
LibRaw RawProcessor;

ret = RawProcessor.open_file(av)
ret = RawProcessor.unpack()

val = RawProcessor.imgdata.rawdata.raw_image[0];
< /code>
Из этого я предположил, что DLL управляет распределением памяти для данных изображения и заполняет структуры с указателями на массивы USHORT. Обертка JNA выглядит так (просто Snip, так как вложенные структуры обширны для мелодии> 1000 строк!): < /P>
public interface LibRaw extends Library {

public class LibRaw_data extends Structure {
public Pointer image;

/*
Other members
*/

public LibRaw_rawdata rawdata;
}

public class LibRaw_rawdata extends Structure {
public Pointer raw_alloc;

public Pointer raw_image;
//public PointerByReference raw_image = new PointerByReference();

/*
Other members
*/

}

LibRaw INSTANCE = (LibRaw) Native.loadLibrary(dllPath, LibRaw.class);

LibRaw_data libraw_init(int flags);
int libraw_open_file( LibRaw_data lr, String fname );
int libraw_unpack( LibRaw_data lr );
void libraw_close( LibRaw_data lr );
int libraw_raw2image();
int libraw_dcraw_process();
void libraw_close( LibRaw_data lr );

// ... other functions ...

}
< /code>
... и мой основной код имеет: < /p>
LibRaw.LibRaw_data librawdata = new LibRaw.LibRaw_data();

librawdata = LibRaw.INSTANCE.libraw_init(0);

retCode = LibRaw.INSTANCE.libraw_open_file( librawdata, fname );
retCode = LibRaw.INSTANCE.libraw_unpack( librawdata );

if (librawdata.rawdata.raw_image != null) ...
< /code>
Все это все компилируется OK и работает без ошибки, но после вызова распаков я ожидаю Получите доступ к данным изображения.
Но, несмотря на все остальное, что появляется ОК (другие значения действительны и разумные, без ошибок), RAW_IMAGE и другой указатель данных изображения все являются нулевыми.
Я видел несколько примеров, которые кажутся актуальными, которые предполагают использование pointerbyreference, но это имеет одинаковый конечный результат, без ошибок и нулевых указателей. < /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... a-pointers

Вернуться в «JAVA»