与SWIG Directors for Java一起使用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,并且生成了一个中断的接口,因为它使用的类型与代理类使用的类型不同 我有

我开始掌握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
,并且生成了一个中断的接口,因为它使用的类型与代理类使用的类型不同

我有一个简单的例子来说明我正在尝试做什么(在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);
  }
}