与SWIG Directors for Java一起使用shared_ptr
我开始掌握SWIG的诀窍,最新版本(v3.0)的SWIG似乎可以处理我所需要的一切,包括C++11特性,但在我的director类中使用shared_ptr时,我遇到了一个障碍 我已经能够获得与SWIG Directors for Java一起使用shared_ptr,swig,Swig,我开始掌握SWIG的诀窍,最新版本(v3.0)的SWIG似乎可以处理我所需要的一切,包括C++11特性,但在我的director类中使用shared_ptr时,我遇到了一个障碍 我已经能够获得shared\u ptr来使用普通的代理类,非常好,但是现在在我的控制器上,它似乎没有得到开箱即用的支持。它给了我自动生成的类型,比如SWIGTYPE\u p\u std\u shared\u ptrT\u MyDataType\u t,并且生成了一个中断的接口,因为它使用的类型与代理类使用的类型不同 我有
shared\u ptr
来使用普通的代理类,非常好,但是现在在我的控制器上,它似乎没有得到开箱即用的支持。它给了我自动生成的类型,比如SWIGTYPE\u p\u std\u shared\u ptrT\u MyDataType\u t
,并且生成了一个中断的接口,因为它使用的类型与代理类使用的类型不同
我有一个简单的例子来说明我正在尝试做什么(在swig 3.0上使用swig-c++-java Test.I
运行):
测试.i
%module(directors="1") test
%{
%}
%include <std_shared_ptr.i>
%shared_ptr(MyDataType)
class MyDataType {
public:
int value;
};
class NonDirectorClass {
public:
std::shared_ptr<MyDataType> TestMethod();
};
%feature("director") CallbackBaseClass;
class CallbackBaseClass {
public:
virtual ~CallbackBaseClass() {};
virtual std::shared_ptr<MyDataType> GetDataFromJava() {};
};
%模块(directors=“1”)测试
%{
%}
%包括
%共享ptr(MyDataType)
类MyDataType{
公众:
int值;
};
类非目录类{
公众:
std::shared_ptr TestMethod();
};
%功能(“控制器”)CallbackBaseClass;
类CallbackBaseClass{
公众:
virtual~CallbackBaseClass(){};
虚拟std::shared_ptr GetDataFromJava(){};
};
基本上,我要做的是在Java中扩展CallbackBaseClass
,我希望能够传递我的共享\u ptr包装类型。非director类可以很好地生成共享的_ptr类型。director类代理文件生成正确,但包装中的SwigDirector\uu
方法引用了不正确的类型
似乎我可以通过将SWIGTYPE\u p\u std\u shared\u ptrT\u MyDataType\u t
的类型更改为MyDataType
来手动修复文件,但我希望有更多swig知识的人能够回答这个问题,以便正确生成该文件
我得到的最好的线索是,但我仍在努力找出如何正确使用这些类型映射,特别是对于共享的\u ptr
而不是基本的原语
更新:
文件:
注意:目前不支持%shared_ptr和控制器功能
尽管没有说明原因。我想知道这对于swig董事来说是否是不可能的,是否有充分的理由不在董事中使用共享的ptr。似乎使用与其他地方相同的类型是有意义的。我希望答案是这仍然是可能的。最新版本的SWIG文档现在显示: “对
%shared\u ptr
的支持有些有限,不同目标语言的director功能和成功程度各不相同。请通过提供具有改进功能的修补程序来帮助改进此支持。”
为了使您的示例正常工作,我们似乎需要添加四个缺少的类型映射:directorin、directorout、javadirectorin和javadirectorout:
%模块(directors=“1”)测试
%包括
%{
#包括
#包括
%}
%共享ptr(MyDataType)
%功能(“控制器”)CallbackBaseClass;
%typemap(javadirectorin)std::shared_ptr“new$typemap(jstype,MyDataType)($1,true)”;
%typemap(directorin,descriptor=“L$typemap(jstype,MyDataType);”)std::shared_ptr%{
*($&1_型*)&j$1=新的$1_型($1);
%}
%typemap(javadirectorout)std::shared_ptr“$typemap(jstype,MyDataType).getCPtr($javacall)”;
%类型映射(directorout)标准::共享\u ptr%{
$&1_type tmp=NULL;
*($&1_类型*)和tmp=*($&1_类型*)和$input;
如果(!tmp){
SWIG_JavaThrowException(jenv,SWIG_JavaNullPointerException,“尝试取消引用空$1_类型”);
返回NULL;
}
$result=*tmp;
%}
%内联%{
类MyDataType{
公众:
int值;
};
类非目录类{
公众:
std::shared_ptr TestMethod(){return std::make_shared();}
};
类CallbackBaseClass{
公众:
virtual~CallbackBaseClass(){};
虚拟std::shared_ptr GetDataFromJava()=0;
};
void frobinate(CallbackBaseClass和cb){
标准::cout
public class run extends CallbackBaseClass {
public MyDataType GetDataFromJava() {
MyDataType val = new MyDataType();
val.setValue(123);
return val;
}
public static void main(String[] argv) {
System.loadLibrary("test");
run r = new run();
System.out.println("In Java: " + r.GetDataFromJava().getValue());
test.frobinate(r);
}
}