gpt4 book ai didi

swig - 将 shared_ptr 与 SWIG Director for Java 一起使用

转载 作者:行者123 更新时间:2023-12-04 08:08:40 36 4
gpt4 key购买 nike

我开始掌握 SWIG 的窍门,SWIG 的最新版本 (v3.0) 似乎可以处理我开箱即用所需的一切,包括 C++11 功能,但我遇到了麻烦开始在我的导演类(class)中使用 shared_ptr。

我已经能够得到shared_ptr与普通代理类一起工作很棒,但现在在我的导演上,它似乎不支持开箱即用。它给了我自动生成的类型,如 SWIGTYPE_p_std__shared_ptrT_MyDataType_t并且正在生成一个损坏的接口(interface),因为它没有使用代理类使用的相同类型。

我有一个我正在尝试做的简化示例(在 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() {};
};

基本上我要做的是扩展 CallbackBaseClass在 Java 中,我希望能够传递我的 shared_ptr 包装类型。非导演类生成 shared_ptr 类型就好了。导演类代理文件生成正确,但 SwigDirector_包装器中的方法引用了不正确的类型。

看来我可以通过更改 SWIGTYPE_p_std__shared_ptrT_MyDataType_t 的类型来手动修复文件至 MyDataType无处不在,但我希望有更多知识的人可以回答这个问题,以便正确生成。

我最好的线索是 here ,但我仍在尝试弄清楚如何正确使用这些类型映射,尤其是对于 shared_ptr而不是基本的原语。

更新:

文档 says :

Note: There is currently no support for %shared_ptr and the director feature.



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

最佳答案

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

"There is somewhat limited support for %shared_ptr and the director feature and the degress of success varies among the different target languages. Please help to improve this support by providing patches with improvements."



为了使您的示例正常工作,我们似乎需要添加四个缺失的类型映射,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 类型映射仍然需要在director_connect 中进行查找,因为它依赖于具有正确的描述符。

这四个类型映射在功能上与 in、javain 和 javaout 类型映射等效,但由于它们在导向器中的作用而颠倒过来。

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

我能够测试并运行该示例,我添加了以下 run.java:
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

运行时给出:

In Java: 123
In C++: 123

我猜想在 Java 的情况下 shared_ptr +directors 使描述符正确的微妙之处可能是让这个“正常工作”开箱即用的主要障碍。

关于swig - 将 shared_ptr 与 SWIG Director for Java 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23333446/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com