Предварительно выделить буфер для вызова сгенерированного моста SWIG из Java? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть простая C библиотека, которую я использую с Java. Мост полностью работает. Однако для одного из методов требуется массив, что приводит к нежелательному выделению / освобождению памяти.

SWIG код:

typedef struct {} Foo;
%apply short[] {const int16 *FOODATA};

%extend Foo {
    Foo(size_t bufferSize, int *errcode) {

        /* WHAT TO DO WITH BUFFER SIZE?? */

        Foo *foo = foo_create();
        *errcode = foo ? 0 : -1;
        return foo;
    }

    ~Foo() {
        foo_free($self);
    }

    void bar(const int16 *FOODATA, size_t FOOSIZE, int *errcode) {
        *errcode = foo_bar($self, FOODATA, FOOSIZE);
    }
}

Java код:

final int bufferSize = 32768;
final short[] bar = new short[bufferSize];
Foo foo = new Foo(bufferSize);
for (int i = 0; i < 1000; i++) {
    // Fill bar with at most 32768 beers...
    // ...

    foo.bar(bar, bar.length);
}

Это работает, но каждый вызов bar() подразумевает выделение с использованием malloc() и последующее освобождение с использованием free() - в сгенерированном SWIG коде. Очевидно, что это пустая трата ресурсов.

Как мне избежать временного выделения / освобождения памяти для моего массива , отправленного на foo_bar()?

Очевидно, размер буфера известен заранее, поэтому должна быть возможность предварительно выделить буфер и указать SWIG, чтобы использовать это.

...