Я пытаюсь перейти с c ++ на java DLL с файлом заголовка lib.h
enum class Code : uint32_t
{
ok = 0,
cancelled = 1,
};
struct Result
{
Result(): m_code(Code::ok) {}
Result(Code code, const std::string& t = std::string()) :m_code(code), m_text(t) {}
Code code() const { return m_code; }
const std::string& text() const { return m_text; }
private:
Code m_code;
std::string m_text;
};
class IApp
{
public:
virtual std::pair<std::uint8_t, std::uint8_t> systemModeInt() = 0;
virtual std::pair<Result, std::uint8_t> systemMode() = 0;
virtual std::pair<Result, std::string> objectName() = 0;
virtual std::pair<Result,std::vector<uint8_t>> readParameters() = 0;
}
мой скрипт swig, который обрабатывает std :: pair, выглядит следующим образом:
%include <std_pair.i>
#include "lib.h"
%template(ShortPair) std::pair<std::uint8_t, std::uint8_t>;
%template(ResultStringPair) std::pair<Result, std::string>;
%template(ResultShortPair) std::pair<Result, std::uint8_t>;
%template(ResultVectorPair) std::pair<Result,std::vector<uint8_t>>;
Я вижу, что swig без проблем генерирует java-код для классов Result и ShortPair (std :: pair). Но во всех случаях, когда пара содержит настраиваемый объект, возникают некоторые проблемы:
- Результат класса, который анализируется по умолчанию, не распознается и не используется при генерации кода паро-обертки, поэтому в ResultStringPair я вижу SWIGTYPE_p_Result вместо Result:
public class ResultStringPair {
private transient long swigCPtr;
protected transient boolean swigCMemOwn;
public ResultStringPair() {
this(vselibJNI.new_ResultStringPair__SWIG_0(), true);
}
public ResultStringPair(SWIGTYPE_p_Result first, String second) { this(vselibJNI.new_ResultStringPair__SWIG_1(SWIGTYPE_p_Result.getCPtr(first), second), true);
}
- Есть странная пара классов, которая генерируется и используется по умолчанию в java-коде. Например, создается и используется класс SWIGTYPE_p_std__pairT_lib__Result_std__string_t, хотя ResultStringPair определен и сгенерирован.
public SWIGTYPE_p_std__pairT_lib__Result_std__string_t objectName() {
return new ...
}
public class SWIGTYPE_p_std__pairT_lib__Result_std__string_t {
private transient long swigCPtr;
protected SWIGTYPE_p_std__pairT_lib__Result_std__string_t(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}
protected SWIGTYPE_p_std__pairT_lib__Result_std__string_t() {
swigCPtr = 0;
}
protected static long getCPtr(SWIGTYPE_p_std__pairT_lib__Result_std__string_t obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}
Как сгенерировать правильные java-оболочки с swig для std :: pair с настраиваемыми объектами и избежать автогенерированных SWIGTYPE_p_Result, SWIGTYPE_p_std__pairT_lib__Result_std__string_t?