У меня есть простая 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
, чтобы использовать это.