当前位置: 首页 > 知识库问答 >
问题:

使用shared_ptr与SWIG董事Java

包阳成
2023-03-14

我开始掌握SWIG的诀窍,最新版本(v3.0)的SWIG似乎可以处理我需要的所有现成功能,包括C 11功能,但在我的director类中使用shared_ptr时,我遇到了一个障碍。

我已经能够获得共享的\u ptr来使用普通的代理类,非常好,但现在在我的董事会上,它似乎没有得到现成的支持。它给了我自动生成的类型,比如SWIGTYPE_p_std_uushared_ptrT_MyDataType_t,并生成了一个中断的接口,因为它使用的类型与代理类使用的类型不同。

我有一个简单的例子来说明我正在尝试做什么(在swig 3.0上运行swig-c-java Test.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() {};
};

基本上,我将要做的是在Java中扩展CallbackBaseClass,我希望能够传递共享的\u ptr包装类型。非director类可以很好地生成共享的_ptr类型。director类代理文件生成正确,但包装中的SwigDirector\uu方法引用了不正确的类型。

似乎我可以通过将SWIGTYPE_p_std_ushared_ptrT_MyDataType_t的类型更改为MyDataType来手动修复文件,但我希望有更多swig知识的人能够回答这个问题,以便正确生成。

这里是我掌握的最好的线索,但我仍在努力找出如何正确使用这些类型映射,尤其是对于共享的_ptr而不是基本的原语。

更新:

文件上说:

注意:目前不支持%shared_ptr和director功能。

尽管没有说明原因。我想知道这对于swig董事来说是否是不可能的,是否有充分的理由不在董事中使用shared_ptr。似乎使用与其他地方相同的类型是有道理的。我希望答案是这仍然是可能的。

共有1个答案

唐彦
2023-03-14

最新版本的SWIG留档现在为:

“对%shared_ptr的支持有些有限,不同目标语言的director功能和成功程度各不相同。请通过提供改进补丁来帮助改进此支持。”

为了让您的示例发挥作用,我们似乎需要添加四个缺失的类型映射:directorin、directorout、javadirectorin和javadirectorout:

%module(directors="1") test

%include <std_shared_ptr.i>

%{
#include <memory>
#include <iostream>
%}

%shared_ptr(MyDataType)

%feature("director") CallbackBaseClass;

%typemap(javadirectorin) std::shared_ptr<MyDataType> "new $typemap(jstype, MyDataType)($1,true)";
%typemap(directorin,descriptor="L$typemap(jstype, MyDataType);") std::shared_ptr<MyDataType> %{
  *($&1_type*)&j$1 = new $1_type($1);
%}

%typemap(javadirectorout) std::shared_ptr<MyDataType> "$typemap(jstype, MyDataType).getCPtr($javacall)";
%typemap(directorout) std::shared_ptr<MyDataType> %{
  $&1_type tmp = NULL;
  *($&1_type*)&tmp = *($&1_type*)&$input;
  if (!tmp) {
    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type");
    return NULL;
  }
  $result = *tmp;
%}

%inline %{
class MyDataType {
public:
    int value;
};

class NonDirectorClass {
public:
    std::shared_ptr<MyDataType> TestMethod() { return std::make_shared<MyDataType>(); }
};

class CallbackBaseClass {
public:
    virtual ~CallbackBaseClass() {};
    virtual std::shared_ptr<MyDataType> GetDataFromJava() = 0;
};

void frobinate(CallbackBaseClass& cb) {
    std::cout << "In C++: " << cb.GetDataFromJava()->value << "\n";
}
%}

尽管在示例中只使用directorout大小写,但directorin typemap仍然需要使director_connect中的查找成功,因为这取决于拥有正确的描述符。

这四种类型映射在功能上与in、javain和javaout类型映射相当,但由于它们在控制器中的角色而相反。

它们不足以处理所有情况,但它们在您的示例中有效。描述符中的$typemap调用需要一个比Ubuntu 14.04中包含的版本更新的SWIG 3版本——以我编写的形式,我测试的唯一版本是从主干中签出的。您可以手动编写描述符(这只是Descriptor="LMyDataType;"),但显然这不太通用。按上述方式编写它的好处是它也可以正确处理%rename指令。这也不能正确处理包,因此在这种情况下您也必须再次手动编写它。

我能够测试并运行这个示例,我添加了以下运行。爪哇:

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);
  }
}

编译并运行了它:

~/swig-trunk/preinst-swig -Wall -c++ -java  test.i  
clang++-3.6 -stdlib=libc++ -Wall -Wextra -std=c++1y test_wrap.cxx -o libtest.so -I/usr/lib/jvm/default-java/include/ -I/usr/lib/jvm/default-java/include/linux -shared -fPIC 
javac run.java
LD_LIBRARY_PATH=. java run

当ran给出:

In Java: 123
In C++: 123

我想在Javashared_ptr导演的情况下,围绕正确获取描述符的微妙之处可能是让这个"just work"开箱的主要障碍。

 类似资料:
  • 董事长CEO Open Source ERP是一款设计良好、完全开放源代码的免费软件,是一款开源供中小企业免费使用的实用型的免费ERP系统,具有界面活泼、简单易学的特点。系统含盖了经营中心,订单管理,销售管理,采购管理,库房管理,生产管理,质量检测,财务管理,销售统计,客户管理,产品管理,行政中心,人力资源几个模块,将业务流程按照部门管理职能进行划分,突破了单部门信息化处理的模式,着眼于将整个企业

  • 我想使用SWIG将暴露到Tcl层。但目前我不知道我可以暴露这个。我发现SWIG/Lib文件夹包含的接口文件。但在内容中我发现我不能直接使用它。它必须包含在“”之后。但在“”文件夹中没有像这样的东西但我们有类似的界面,我可以包含在Java中。

  • 头文件: "boost/shared_ptr.hpp" 几乎所有稍微复杂点的程序都需要某种形式的引用计数智能指针。这些智能指针让我们不再需要为了管理被两个或多个对象共享的对象的生存期而编写复杂的逻辑。当引用计数降为零,没有对象再需要这个共享的对象时,这个对象就自动被销毁了。引用计数智能指针可以分为插入式(intrusive)和非插入式(non-intrusive)两 类。前者要求它所管理的类提供明

  • 我试图使用Java Runtime调用linux aspell程序,以在Java中进行pt\u BR拼写检查。getRuntime()。exec()。问题是,它似乎与输入/输出字符编码背道而驰。一些输入字在重音字母位置分成两个字,输出用� 对于重音字母。我可以看到aspell可以在命令管道模式下正确拼写检查pt\u BR。设置aspell的代码如下: 将输入馈送到aspell的代码: 要从aspe

  • 到目前为止,我已经编写了两个rails应用程序,这无疑让我对ruby rails非常满意。但我不能对C说同样的话。我甚至不知道我在看什么,说实话,每次我看C的时候,它看起来像通心粉。 我正在尝试构建一个spotify web应用程序。web API太差劲了,所以我不得不用这个:https://developer.spotify.com/technologies/libspotify/ 文档:htt

  • 问题内容: 我正在使用SWIG制作C 库的Java包装器(关于Json(反)序列化),以便在Android上使用它。我用C 定义了一个抽象类,代表一个可以(反序列化)的对象: 现在,我正在尝试从此类生成Java接口。这是我的SWIG界面: 但是生成的Java代码(显然是,因为我无法找出如何告诉SWIG这是一个接口)是一个简单的类,带有两个方法和一个默认的构造函数/析构函数: 如何使用SWIG生成有