- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始掌握 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
无处不在,但我希望有更多知识的人可以回答这个问题,以便正确生成。
shared_ptr
而不是基本的原语。
Note: There is currently no support for %shared_ptr and the director feature.
最佳答案
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."
%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";
}
%}
$typemap
描述符中的调用需要比 Ubuntu 14.04 中包含的版本更新的 SWIG 3 版本——以我编写的形式,我测试过的唯一版本是从主干中 check out 的。您可以手动编写描述符(即
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
In Java: 123
In C++: 123
shared_ptr
+directors 使描述符正确的微妙之处可能是让这个“正常工作”开箱即用的主要障碍。
关于swig - 将 shared_ptr 与 SWIG Director for Java 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23333446/
做过后端开发,尤其是使用过类似Django或者express对服务器端的路由功能应该都比较熟悉,国外流行的博客系统wordpress也是非常经典的路由实现案例。那么,究竟什么的路由呢,下面通过wor
我一直在试图像疯了一样弄清楚如何做到这一点的VCL和我开始认为这是不可能的。我有几个后端应用程序服务器,可以服务各种不同的主机。我需要使用 Varnish 来缓存任何主机的页面,并将缺少缓存的请求发送
是否可以在 flatiron/director 中创建带有可选参数的路由? var router = Router({ 'order' : function(){ // cre
在我的虚拟 CentOS Linux 版本 7.3.1611 上配置 Bacula 服务器以执行基本的本地备份工作时,我试图保持理智。 我在 conf 文件中准备了我认为必要的所有配置,并相应地准备了
首先,我想承认这个问题与this other one 非常相似。 ,但我想问得更具体,并希望获得更高质量的答案。 最近我学习了一个教程,其中使用 Director 实现了 Builder 模式。为了演
我正在学习 Builder Pattern 在上面的链接(Java 示例)中,我注意到 Builder 提供了构造多个组件的接口(interface)。除了调用它们,我们还调用了 getProduct
所以我想创建一个 utility.js 文件,其中包含一些我知道在多个文件中需要的操作和变量。具体获取设备的宽度和高度。 我尝试使用: var size = cc.Director.getInstan
最近我遇到了 Builder 设计模式。似乎不同的作者使用“构建器模式”来指代不同的风格,所以让我描述一下我所询问的模式。 我们有一个创建产品的算法,即不同类型的对象。在足够高的抽象级别上,算法对于所
我只是在研究Builder模式,不明白Director的意思。 http://en.wikipedia.org/wiki/Builder_pattern 仅仅拥有 Builder 及其子类就足够了吗?
在我的 AppDelegate 的 applicationDidEnterBackground() 中,我调用了 cocos2d::Director::getInstance()->stopAnima
尝试使用 Cloudera Director 创建新集群时出现以下错误。有什么建议吗? [ec2-user@ip-10-0-2-227 cloudera-director-1.0.0]$ ./bin/
我正在从本地系统导入在 AWS 服务器上移动的数据库备份 使用命令恢复 rethink db 时: rethinkdb 恢复/home/league_ally/rethinkexport.tar.gz
我有一个虚拟目录,就在我用来存储产品图片的网络应用程序的根目录之上。 在我安装 ELMAH 进行日志记录后,我意识到图像停止工作了。这是因为 ELMAH 在 productimages/bin 文件夹
我遇到了有关 Director 类和在外部类上对某些对象进行分组的问题。这是我的简短示例应用程序脚本。 main.lua gameScene.lua fakeScene.lua theClass.lu
我在我们的应用程序中使用Director.js 和Turbolinks。 在更改哈希值时它工作得很好,但是当使用浏览器后退按钮时(应该只是将哈希值更改回之前的哈希值,并触发相关的 Director.j
我正在关注 Cloudera AWS 快速入门 https://s3.amazonaws.com/quickstart-reference/cloudera/hadoop/latest/doc/Clo
我创建了一个 vpc internal http 负载均衡器 - 使用 GCP 的新 Traffic Director,包括转发规则、url 映射、一对指向 VM 和 NEG 的后端。该解决方案工作正
有没有人遇到过这个错误 Log generated on 29/12/2014 00:12:01 Failed to deploy application on the target device.
我想将 express.js 与 Flatiron 的 director(路由器)和 Resourceful (ODM) 一起使用,因为我需要享受路由表的好处以及通过验证清理多数据库模式。我现在完全转
在构建 tool:crfsuite 时,我在构建 Python 模块时从 C++ 上的 swig 得到了一个错误: swig -c++ -python -I../../include -o expor
我是一名优秀的程序员,十分优秀!