Я пытаюсь создать Java привязок soxlib, используя Jnaerator и BridJ. Но одна из функций в сгенерированном коде вызывает memleak или, может быть, я неправильно ее использую. Вот функция soxlib:
LSX_RETURN_OPT
sox_format_t *
LSX_API
sox_open_memstream_write(
LSX_PARAM_OUT char * * buffer_ptr,
LSX_PARAM_OUT size_t * buffer_size_ptr,
LSX_PARAM_IN sox_signalinfo_t const * signal,
LSX_PARAM_IN_OPT sox_encodinginfo_t const * encoding,
LSX_PARAM_IN_OPT_Z char const * filetype,
LSX_PARAM_IN_OPT sox_oob_t const * oob
);
Генерируемая функция в Java:
public static Pointer<sox_format_t > sox_open_memstream_write(
Pointer<Pointer<Byte > > buffer_ptr,
Pointer<SizeT > buffer_size_ptr,
Pointer<sox_signalinfo_t > signal,
Pointer<sox_encodinginfo_t > encoding,
Pointer<Byte > filetype,
Pointer<sox_oob_t > oob)
Как я вызываю функцию в Java:
...//Init
Pointer<sox_format_t> source = SoxLibrary.sox_open_read(
Pointer.pointerToCString(SOURCE_PATH),
null,
null,
null);
Pointer<Pointer<Byte>> outPtr = Pointer.allocatePointer(Byte.TYPE);
Pointer<SizeT> outLen = Pointer.allocateSizeT();
Pointer<sox_format_t> destination = SoxLibrary.sox_open_memstream_write(
outPtr,
outLen,
Pointer.getPointer(source.get().signal()),
null,
Pointer.pointerToCString("wav"),
null);
...//Process audio
SoxLibrary.sox_close(source);
SoxLibrary.sox_close(destination);
outPtr.release();
outLen.release();
Применение l oop к приведенному выше коду приводит к непрерывному росту использования памяти. Замена sox_open_memstream_write на sox_open_mem_write , который использует массив фиксированного размера с предварительным выделением, работает нормально.
Это правильный способ инициализации outPtr & outLen с BridJ? Есть ли что-то еще, что я должен сделать, чтобы освободить память?
Некоторая дополнительная информация. Моя ОС: Ubuntu 18.04. Soxlib версия 14.4.2 (libsox-dev). Код привязки генерируется с помощью jnaerator-0.12-shaded.jar.