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 или этот указатель (как структура с одним членом).

Ответы на вопрос(3)

Ваш ответ на вопрос