Использование таблицы типов SWIG для передачи указателя на указатель:
Вот еще один подход, использующий карты типов. Он нацелен на Perl, а не на Java, но концепции совпадают. И, наконец, мне удалось заставить его работать с использованием карт типов и без вспомогательных функций:
Для этой функции:
typedef void * MyType;
int getblock( int a, int b, MyType *block );
У меня есть 2 карты типов:
%typemap(perl5, in, numinputs=0) void ** data( void * scrap )
{
$1 = &scrap;
}
%typemap(perl5, argout) void ** data
{
SV* tempsv = sv_newmortal();
if ( argvi >= items ) EXTEND(sp,1);
SWIG_MakePtr( tempsv, (void *)*$1, $descriptor(void *), 0);
$result = tempsv;
argvi++;
}
И функция определяется как:
int getblock( int a, int b, void ** data );
В моем файле .i. Теперь, это возвращает непрозрачный указатель в карте типов argout, потому что это то, что полезно для этой конкретной ситуации, однако, вы можете заменить строку SWIG_MakePtr на что-то, чтобы фактически делать вещи с данными в указателе, если хотите. Кроме того, когда я хочу передать указатель в функцию, у меня есть карта типов, которая выглядит следующим образом:
%typemap(perl5, in) void * data
{
if ( !(SvROK($input)) croak( "Not a reference...\n" );
if ( SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0 ) == -1 )
croak( "Couldn't convert $1 to $1_descriptor\n");
}
И функция определяется как:
int useblock( void * data );
В моем файле .i.
Очевидно, что это все perl, но он должен отображаться довольно напрямую на Java, насколько позволяет архитектура typemap. Надеюсь, это поможет ...