- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题相当简单,我在 C++ 命名空间中有一些常量,我想使用 SWIG 2.0.8 对其进行包装。它看起来像这样:
namespace Example {
static const float PI = 3.14159f
...
/* Lots of classes are here */
}
不幸的是,SWIG 处理这个问题相当笨拙。在 C# 的情况下,它将常量添加到一个与命名空间同名的类中,因此必须使用 Example.Example.PI
访问它,即使我明确地 using Example
(由于被模块名称屏蔽)。
在 Java 中,情况更糟,因为它根本不将其视为常量,我被迫使用 Example.getPI()
作为方法调用而不是常量类变量来调用它.
如果我将常量移动到全局命名空间,这似乎可行,但必须使用 ExampleConstants.PI
访问变量。
理想情况下,我希望两种语言都能够通过 Example.PI
访问常量,以与 C++ 保持一致。但是,如果我可以在我的命名空间中有一个 Constants
类,这样我就可以在任何一种语言中使用 Constants.PI
,我会很高兴地做出妥协。但是当然,C++ 不允许在类中定义非整数类型,这仍然不能解决 Java 中的问题。
是否有任何优雅的方式来使用 SWIG 处理这些命名空间常量?如果没有,我是否可以手动添加 Java 或 C# 类来定义它们?
最佳答案
我为 C++ - C# 解决了类似的问题。我不确定这是否正是您要查找的内容,但我希望您能找到一些对您有用的信息。
我没有在我的项目中接触过 Java 代码。
Swig 解决方案。
我用 C++ 中的公共(public)静态无参数函数创建了类。
然后我使用 SWIG 将它们导出到 C#。
我在命令行中使用 -namespace <name>
为 C# 指定了命名空间 key 。更多详细信息,请访问页面 SWIG and C#
因此,您可以实现解决方案以使用 Constants::PI()
访问您的常量和 Constants.PI()
直接解决方案
如果您不想使用 SWIG 或其他库,您应该使用 PInvoke .使用它时有很多细节和特殊情况。我找到的关于该主题的最全面的文章是 Mono Interop with Native Libraries
你应该考虑JNI用于 Java。
请注意,C++ 函数作为纯 C 函数在没有 namespace 的情况下导出,您应该创建 C# 类并使用 DllImport attribute 创建函数将函数包装回命名空间。
一般来说,如果您的 C++ 接口(interface)或多或少是固定的和/或很小,我会坚持直接解决方案,因为 SWIG 层有许多特定情况,应该与 PInvoke/JNI 一起学习。但是,如果您的 C++ 接口(interface)经常更改并且需要付出大量努力来保持 C++、C# 和 Java 的一致性,那么您肯定需要考虑 SWIG。
您可以在 https://stackoverflow.com/a/11909571/13441 找到使用 PInvoke 的重要示例
关于 C++ 常量。您可以在类中指定 C++ 常量,引用 C++ static constant string (class member)了解详情。
我使用 SWIG 1.3.40。
希望对您有所帮助。
关于c# - SWIG 中的命名空间常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13909406/
我正在制作一个 C++ 库的包装器,以便它可以从 Java 中使用,我正在用 Swig 做这个。 我面临的是我有一个类(class) SomeClass ,它有一些重载的方法( someMethod
我有许多要在 SWIG 中重命名的类。我的大部分类(class)看起来像这样some_class ,我想将其重命名为 SomeClass .这很简单: %replace("%(camelcase)s"
PyPy 有一些 compatibility limitations ,尤其是关于 CPython C API。 我用 QuickFix预编译的 SWIG 绑定(bind)附带的包,我正在考虑将它与
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
使用 SWIG 生成接口(interface)模块时,生成的 C/C++ 文件包含大量静态样板函数。因此,如果想通过在同一个应用程序中使用许多单独编译的小接口(interface)来模块化 SWIG
我正在应用 SWIG 手册中有关嵌套类的解决方法,该部分使用全局内部类。在这里,我将向您展示一个类似于手册中的版本,但为您尽可能地简化了。我还必须将内联定义 {} 添加到 method(),因为没有它
我有一个现有的库 (JPhysX),它是原生 C++ 库 (PhysX) 的 Java 包装器。 Java 库使用 SWIG 生成的类型,例如 com.jphysx.SWIGTYPE_p_NxStre
有没有办法动态向下转换 swig 对象的 swig 代理? 这样做的原因是为了模拟 C++ 向下转换,但纯粹来自 python。例如,典型的 C++ 用法是 MyBase* obj = new MyB
我在远程服务器上工作,所以我在本地安装了 swig,使用 -prefix=/home/user/directory。 我有一个来自同事的 makefile,其中包含以下命令: swig $(SWIG_
据我所知,在用于将 c++ 文件编译为 python 扩展模块的 .i 文件中,我们可以添加一些 python 代码,如下所示(来自 example for adding additional pyt
我的 Swig 文件 (.i) 中有以下代码: %extend vgSofa::handler::VertexShape { vgd::Shp createVSWithNode( so
我有一个用 swig 包装的类的 C++ 代码。我无法修改代码或包装。在 python 中,我使用 ctypes 拥有一个指向所述 C++ 类的实例的指针。如何围绕该指针创建一个 swig 包装器?
我开始掌握 SWIG 的窍门,SWIG 的最新版本 (v3.0) 似乎可以处理我开箱即用所需的一切,包括 C++11 功能,但我遇到了麻烦开始在我的导演类(class)中使用 shared_ptr。
我正在使用 javacode 类型映射来添加一些附加函数来代替 SWIG 生成的函数。我想删除 SWIG 为 unsigned char mac[6]; 生成的默认 getter 和 setter(p
我正在使用 SWIG 为我的 C 库生成 Python 语言绑定(bind)。我已经设法构建了绑定(bind)和导出的数据结构,但在使用该库时我不得不跳过一些障碍。 例如,C 头文件的数据类型和函数原
我最近在node-js应用程序中从jade模板引擎切换到了swig。在使用jade时我使用了命令 jade.render('/sample.jade',{obj:object});渲染模板并传递对象。
我在我的 python 代码中发现了瓶颈,尝试了 Psycho 等。然后决定编写一个 c/c++ 扩展来提高性能。 在 swig 的帮助下,您几乎不需要关心参数等。一切正常。 现在我的问题是:swig
由于 SWIG 无法解析 __attribute__((packed))在我想包装的一些 C 结构上,我通过放置一个 #define __attribute__(x) 在我的.i文件。 这什么时候会来
我有一个包含 C++ header 的 SWIG 文件。 痛饮文件: %module my_module %{ #include "my_c_file.h" %} %include "my_c_fil
我正在尝试学习如何使用 SWIG,并且想知道我是否正在执行一些不需要执行的额外步骤。我目前有文件 Dog.cpp、Dog.h 和 Dog.i。我正在尝试使用 SWIG 包装 Dog.cpp 以便在 P
我是一名优秀的程序员,十分优秀!