обработка ссылок на указатели / двойные указатели с использованием SWIG [C ++ to Java] - PullRequest
0 голосов
/ 31 марта 2010

Мой код имеет интерфейс типа

class IExample { ~IExample(); //pure virtual methods ...};

класс, наследующий интерфейс, подобный

class CExample : public IExample { protected: CExample(); //implementation of pure virtual methods ... };

и глобальная функция для создания объекта этого класса -

createExample( IExample *& obj ) { obj = new CExample(); } ;

Теперь я пытаюсь получить оболочку Java API, используя SWIG, интерфейс, сгенерированный SWIG, имеет конструктор типа - IExample(long cPtr, boolean cMemoryOwn) и глобальная функция становится createExample(IExample obj )

Проблема в том, когда я делаю,

IExample exObject = new IExample(ExampleLibraryJNI.new_plong(), true /*or false*/ ); ExampleLibrary.createExample( exObject );

API-интерфейс createExample(...) на уровне C ++ успешно вызывается, однако, когда вызов возвращается на уровень Java, переменная cPtr (long) не обновляется. В идеале эта переменная должна содержать адрес объекта CExample.

Я прочитал в документации, что карты типов могут использоваться для обработки выходных параметров и ссылок на указатели; однако я не могу найти подходящий способ использования карт типов для решения этой проблемы или любого другого обходного пути.

Пожалуйста, предложите, если я делаю что-то не так, или как использовать typemap в такой ситуации?

1 Ответ

0 голосов
/ 06 апреля 2010

Я не знаю, как бы вы решили эту проблему с помощью наборов карт; Java не поддерживает ссылочные параметры, поэтому преобразование будет очень сложным.

Почему бы просто не createExample() вернуть IExample*? Если вам нужно возвращаемое значение для чего-то другого, я рекомендую вернуть std::pair<IExample*,OtherThing> или какой-либо аналогичный структурированный тип.

...