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

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

Сообщение Anonymous »

Справочная информация: я не профессиональный разработчик - я использовал C несколько десятилетий назад и Java несколько лет назад. Я ржаво. , Ширина изображения/высота не является проблемой.
соответствующий бит файла Libraw_types. "> 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 будет чем -то другим, кроме нуле Доступ к данным изображения.
Но, несмотря на все остальное, что появляется OK (другие значения действительны и разумные, без ошибок) RAW_IMAGE, а другой указатель данных изображения - все это NULL. < Br /> Я видел несколько примеров, которые кажутся актуальными, которые предполагают использование pointerbyReference, но это имеет одинаковый конечный результат, без ошибок и нулевых указателей. < /p>

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

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