如何传递std::vector<;用户定义类>;通过Swig将数据传输到Java? 我有下面的C++库,我想用Sigg在java中使用它来生成必要的胶粘代码。但是,我发现很难向用户发送一个用户定义的向量,这些C++有一些数据。我尝试使用std_vector.I但是Swig仍然生成SWIGTYPE\u p_std_vecort\u namespace\u Beer,这与SwigVector实例不匹配 %module pub %include "std_vector.i" namespace std { %template(SwigVector) std::vector<Beer>; } %模块发布 %包括“标准向量i” 名称空间标准{ %模板(SwigVector)std::vector; } %{ #包括“Pub.h” #包括“MyPub.h” #包括“Beer.h” 使用名称空间发布; %} %包括“Pub.h” ... 名称空间顺序{ 类OrderTracker { 公众: 类OrderListener { 公众: OrderListener():orderTracker_{nullptr}{} 虚拟用户(OrderTracker&)=0; 私人: 朋友类订单跟踪器; void setOrderTracker(OrderTracker*OrderTracker) { orderTracker \=orderTracker; } OrderTracker*OrderTracker\ux; }; void addOrderListner(OrderListener&); }; 阶级地位; ... }//结束命名空间顺序 命名空间发布{ 班级酒吧 { 公众: virtual~Pub()=默认值; 虚拟void initOrder()=0; 虚拟std::vector getBeers()=0; ... }; MyPub类:公共酒吧 { 公众: void initOrder()覆盖; std::vector getBeers()覆盖; void generateBill()覆盖; ... 私人: order::OrderTracker*OrderTracker; 类MyOrderListener:public order::OrderTracker::OrderListener { 公众: 显式MyOrderListener(MyPub*pub){this->pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束
以下是我所期望的行为如何传递std::vector<;用户定义类>;通过Swig将数据传输到Java? 我有下面的C++库,我想用Sigg在java中使用它来生成必要的胶粘代码。但是,我发现很难向用户发送一个用户定义的向量,这些C++有一些数据。我尝试使用std_vector.I但是Swig仍然生成SWIGTYPE\u p_std_vecort\u namespace\u Beer,这与SwigVector实例不匹配 %module pub %include "std_vector.i" namespace std { %template(SwigVector) std::vector<Beer>; } %模块发布 %包括“标准向量i” 名称空间标准{ %模板(SwigVector)std::vector; } %{ #包括“Pub.h” #包括“MyPub.h” #包括“Beer.h” 使用名称空间发布; %} %包括“Pub.h” ... 名称空间顺序{ 类OrderTracker { 公众: 类OrderListener { 公众: OrderListener():orderTracker_{nullptr}{} 虚拟用户(OrderTracker&)=0; 私人: 朋友类订单跟踪器; void setOrderTracker(OrderTracker*OrderTracker) { orderTracker \=orderTracker; } OrderTracker*OrderTracker\ux; }; void addOrderListner(OrderListener&); }; 阶级地位; ... }//结束命名空间顺序 命名空间发布{ 班级酒吧 { 公众: virtual~Pub()=默认值; 虚拟void initOrder()=0; 虚拟std::vector getBeers()=0; ... }; MyPub类:公共酒吧 { 公众: void initOrder()覆盖; std::vector getBeers()覆盖; void generateBill()覆盖; ... 私人: order::OrderTracker*OrderTracker; 类MyOrderListener:public order::OrderTracker::OrderListener { 公众: 显式MyOrderListener(MyPub*pub){this->pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束,java,c++,swig,Java,C++,Swig,以下是我所期望的行为 public class main { public static void main(String argv[]) { System.loadLibrary("mypub"); MyPub pub = new MyPub(); pub.initOrder(); while(money > 1000) { SwigVector beers = pub.ge
public class main
{
public static void main(String argv[])
{
System.loadLibrary("mypub");
MyPub pub = new MyPub();
pub.initOrder();
while(money > 1000)
{
SwigVector beers = pub.getBeers();
for(int i =0; i<beers.size(); ++i){
beers[i].getPrice();
}
}
}
}
公共类主
{
公共静态void main(字符串argv[])
{
System.loadLibrary(“mypub”);
MyPub pub=新建MyPub();
pub.initOrder();
而(金钱>1000)
{
SwigVector beers=pub.getBeers();
对于(int i=0;i这应该可以。顺序很重要。请确保在使用类之前定义类:
%module pub
%include "std_vector.i"
%inline %{
enum class BeerType
{
House,
Lager,
Pale,
IPA
};
class Beer
{
public:
Beer() : type{BeerType::House}, price{5.99f} {}
~Beer() = default;
BeerType getType() {return this->type; }
float getBeerPrice() {return this->price; }
private:
BeerType type;
float price;
void setPrice(float price) { this->price = price; }
void setType(BeerType type) { this->type = type; }
};
%}
%template(SwigVector) std::vector<Beer>;
%inline %{
class Pub
{
public:
virtual ~Pub() = default;
virtual void initOrder() = 0;
virtual std::vector<Beer> getBeers() = 0;
virtual void generateBill() = 0;
};
class MyPub : public Pub
{
public:
void initOrder() override {}
std::vector<Beer> getBeers() override { return {Beer(),Beer()}; }
void generateBill() override {}
};
%}
%模块发布
%包括“标准向量i”
%内联%{
枚举类BeerType
{
房子
啤酒,
苍白的,
IPA
};
普通啤酒
{
公众:
Beer():类型{BeerType::House},价格{5.99f}{}
~Beer()=默认值;
BeerType getType(){返回此->类型;}
float getBeerPrice(){返回此->价格;}
私人:
蜂型;
浮动价格;
void setPrice(浮动价格){this->price=price;}
void setType(BeerType类型){this->type=type;}
};
%}
%模板(SwigVector)std::vector;
%内联%{
班级酒吧
{
公众:
virtual~Pub()=默认值;
虚拟void initOrder()=0;
虚拟std::vector getBeers()=0;
虚拟void generateBill()=0;
};
MyPub类:公共酒吧
{
公众:
void initOrder()重写{}
std::vector getBeers()重写{return{Beer(),Beer()};}
void generateBill()重写{}
};
%}
%module pub
%include "std_vector.i"
%inline %{
enum class BeerType
{
House,
Lager,
Pale,
IPA
};
class Beer
{
public:
Beer() : type{BeerType::House}, price{5.99f} {}
~Beer() = default;
BeerType getType() {return this->type; }
float getBeerPrice() {return this->price; }
private:
BeerType type;
float price;
void setPrice(float price) { this->price = price; }
void setType(BeerType type) { this->type = type; }
};
%}
%template(SwigVector) std::vector<Beer>;
%inline %{
class Pub
{
public:
virtual ~Pub() = default;
virtual void initOrder() = 0;
virtual std::vector<Beer> getBeers() = 0;
virtual void generateBill() = 0;
};
class MyPub : public Pub
{
public:
void initOrder() override {}
std::vector<Beer> getBeers() override { return {Beer(),Beer()}; }
void generateBill() override {}
};
%}