gpt4 book ai didi

java - Swig java 进程 std::pair 与来自 C++ 的类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:09 24 4
gpt4 key购买 nike

我正在尝试使用头文件从 C++ 处理到 Java DLL库.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::pairs 如下:

%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 可以毫无问题地为 Result 和 ShortPair (std::pair) 类生成 java 代码。但在所有情况下,如果对包含自定义对象,就会出现一些问题:

  1. 默认情况下解析的类结果未被识别,并且未在对包装代码生成中使用,因此在 ResultStringPair 中我看到 SWIGTYPE_p_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);
}
  1. 有奇怪的对类,在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;
}
}

如何使用 swig 为 std::pair 和自定义对象生成正确的 java 包装器并避免自动生成 SWIGTYPE_p_Result、SWIGTYPE_p_std__pairT_lib__Result_std__string_t?

最佳答案

除了 lib.h 文件中缺少分号外,您还需要对 SWIG .i 文件进行以下更改,我已经在适当的位置对它们进行了注释:

%include <std_pair.i>
%include <std_vector.i> // Missing for vector template
%include <std_string.i> // One of your interface functions had a std::string
%include <stdint.i> // This is needed for uint8_t, uint32_t etc.
%include "lib.h" // This is the most important change - in order to make SWIG read the lib.h file you need to use %include

%template(CharVector) std::vector<uint8_t>; // This was missing and resulted in a SWIGTYPE_ for the last pair
%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>>;

关于java - Swig java 进程 std::pair 与来自 C++ 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com