Как инициализировать / освободить память указателя BridJ, выделенную собственным кодом - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать 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.

...