C std :: string в качестве выходных параметров в Java с SWIG [duplicate]
This question already has an answer here:
SWIG: How to wrap std::string& (std::string passed by reference) 1 answerМне нужно обернуть библиотеку C ++ с SWIG, чтобы использовать ее с Java.
У меня уже есть несколько методов работы, но я столкнулся с ситуацией, в которой я не знаю, как ее решить.
У меня есть пара таких методов:
void method1(std::string & name, std::string & result);
bool method2(std::string & name, std::string & alias, std::string & resurnValue, std::string & returnType);
Примечание. На самом деле это методы-члены класса с именем MyClass.
Я мог бы изменить первый метод, чтобы вернутьstd::string
вместо того, чтобыvoid
и это должно сработать; но я понятия не имею, как обращаться со вторым методом, где два последних параметра являются выходными параметрами. Я видел пару вопросов, касающихсяchar *
выходные параметры (Передача нескольких параметров и выделение строк в C с использованием Swig / Python), но в моем случае должно бытьstd::string
и документация SWIG не упоминает эту ситуациювведите описание ссылки здесь, Также я, вероятно, сталкиваюсь с большим количеством методов, возвращающих 3 или более выходных параметра, возможно, с разными типами.
Наконец, у меня есть небольшой контроль над интерфейсом, я также разрабатываю класс, который действует как точка входа в библиотеку, но он просто передает вызов реальной реализации.
Например, этим мне удалось изменить метод, какmethod3(std::string & s)
вmethod3(const std::string & s)
так что я мог бы использовать его с Java с нормальнымString
.
Таким образом, можно немного изменить сигнатуры методов, но если нативный метод возвращает n выходных параметров, я должен вернуть все из них (я не могу создать новые методы для возврата каждого из них).
Update: Я смотрел на решение, данное Flexo, и прекрасно работает, однако я рассматриваю возможность создания класса для переноса std :: string и использования его для взаимодействия с возвращаемыми строками, очень похожий подход ко второму решению Flexo, но использование этого StringWrapper вместо использования массива Java String в основном выглядит следующим образом:
/*
* The MyClass.i file
*/
%module example
%include "std_string.i"
%{
class StringPtr{
private:
stdString str;
public:
StringPtr(){
}
StringPtr(const stdString & str){
this->str = stdString(str);
}
stdString & getStrRef(){
return (this->str);
}
stdString getStrVal(){
return stdString(this->str);
}
~StringPtr(){
}
};
%}
/////////////////// Export StringPtr to Java
class StringPtr{
public:
StringPtr();
StringPtr(const stdString & str);
stdString getStrVal();
~StringPtr();
};
// I think this is nor necessary
%rename ("$ignore", fullname=1) "StringPtr::getStrRef";
%extend MyClass {
void method1(cons std::string & name, StringPtr & result){
$self->method1(name, result.getStrRef());
}
bool method2(cons std::string & name, cons std::string & alias, StringPtr & returnValue, StringPtr & returnType){
$self->method2(name, alias, returnValue.getStrRef(), returnType.getStrRef());
}
};
%rename ("$ignore", fullname=1) "MyClass::method1";
%rename ("$ignore", fullname=1) "MyClass::method2";
%include "MyClass.h"
Так что мне интересно, с точки зрения производительности, что лучше, это решение Structs (от Flexo), массив строк от Flexo или этот указатель (как структура с одним членом).