java - 如何在swig中使用同一个接口(interface)生成两个代理类

标签 java c++ swig typedef proxy-classes

我有一些代码如下:

class SingleValue
{
public:
   SingleValue()
   {}

   ~SingleValue()
   {}

   const std::string& getValue()const
   {
    return m_nSingleValue;
   }
private:
   int m_nSingleValue;
};

typedef SingleValue RoadType;
typedef SingleValue RoadSubType;
typedef SingleValue FunctionalClass;

现在我想用 SWIG 生成一个 Java 包装器,但它只生成一个代理类 'SingleValue',我想知道如何使用 swig 生成另一个代理类,但我在谷歌搜索后找不到相关信息.

我尝试 %rename,但它只生成一个代理类,而不是三个。

最佳答案

您要实现的目标似乎是强类型化。默认情况下,SWIG 会尝试公开一个与您在 C++ 中看到的行为相同的接口(interface),因此在这种情况下,行为是预期的——弱类型定义都是 C++ 提供的。不过,您可以解决这个问题。

给定头文件:

#include <string>

class SingleValue
{
public:
   SingleValue()
   {}

   ~SingleValue()
   {}

   std::string getValue() const
   {
      return std::to_string(m_nSingleValue);
   }
private:
   int m_nSingleValue;
};

typedef SingleValue RoadType;
typedef SingleValue RoadSubType;
typedef SingleValue FunctionalClass;

inline RoadType make_road() { return RoadType(); }
FunctionalClass make_func() { return FunctionalClass(); }

这与您的不同之处仅在于对 getValue() 的更正以及添加了两个用于测试的内联函数,我们可以通过以下方式包装它并接近强 typedef 语义:

%module test

%{
#include "test.h"
%}

%include <std_string.i>

class SingleValue
{
public:
   SingleValue();
   ~SingleValue();
   std::string getValue() const;
};

struct RoadType : public SingleValue {
};

struct RoadSubType : public SingleValue {
};

struct FunctionalClass : public SingleValue {
};

RoadType make_road();
FunctionalClass make_func();

请注意,我根本没有向 SWIG 展示 typedef,而且我完全撒谎了 RoadType 等的类型和存在,但这没关系,因为所有代码都得到SWIG 生成的代码仍然合法且正确。

这会导致在 make_X 函数返回不同类型的地方生成一个接口(interface)。


如果你想避免头文件和接口(interface)文件之间的重复,你可以引入一个宏来帮助,头文件变成:

#include <string>

class SingleValue
{
public:
   SingleValue()
   {}

   ~SingleValue()
   {}

   std::string getValue() const
   {
      return std::to_string(m_nSingleValue);
   }
private:
   int m_nSingleValue;
};

#ifndef STRONG_TYPEDEF
#define STRONG_TYPEDEF(o,n) typedef o n
#endif

STRONG_TYPEDEF(SingleValue, RoadType);
STRONG_TYPEDEF(SingleValue, RoadSubType);
STRONG_TYPEDEF(SingleValue, FunctionalClass);

inline RoadType make_road() { return RoadType(); }
FunctionalClass make_func() { return FunctionalClass(); }

这意味着接口(interface)文件可以简单地变成:

%module test

%{
#include "test.h"
%}

%include <std_string.i>

#define STRONG_TYPEDEF(o, n) struct n : o {};

%include "test.h"

部分原因是 SingleValue 是一个类,因此强类型定义可以成为 Java 类型系统中的一个子类,以强制检查。如果类型不是类,您仍然可以在不使用继承的情况下做同样的事情,例如 the first part of an answer I gave on a similar problem使用 D 会起作用 - 如果没有任何继承在起作用,您会想要详细说明空结构。

关于java - 如何在swig中使用同一个接口(interface)生成两个代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247223/

相关文章:

java - 函数和可运行对象同时工作(如何?)(Android、Java)

java - 如何使用zookeeper监控不同机器上运行的Java应用程序的状态?

java - 使用 Java 运行 shell 脚本将文件复制到 docker 返回错误

c++ - 如何特化模板

c++ - 如何使用带硬件加密芯片的openssl?

c++ - STL中的优先队列

swig - 为 Openwrt 交叉编译 Gnu Radio

c - 第一个示例由于编译器错误而无法编译

java - JTextArea行、列和字符关系

python - 使绑定(bind)了解祖先绑定(bind)