问题相当简单,我在 C++ 命名空间中有一些常量,我想使用 SWIG 2.0.8 对其进行包装。它看起来像这样:
namespace Example {
static const float PI = 3.14159f
...
/* Lots of classes are here */
}
不幸的是,SWIG 处理这个问题的方式相当笨拙。在 C# 情况下,它将常量添加到与命名空间同名的类中,因此即使我显式使用示例,也必须使用Example.Example.PI 来访问它code>(由于模块名称的屏蔽)。
在 Java 中,情况更糟,因为它根本不将其视为常量,我被迫使用 Example.getPI()
作为方法调用而不是常量类变量来调用它.
如果我将常量移至全局命名空间,这似乎可行,但必须使用 ExampleConstants.PI
访问变量。
理想情况下,我希望两种语言都能够通过 Example.PI
访问常量,以便与 C++ 保持一致。但我会满意的一个妥协是,如果我可以在我的命名空间内有一个 Constants
类,这样我就可以在任何一种语言中使用 Constants.PI
。当然,C++ 不允许在类中定义非整数类型,这仍然不能解决 Java 中的问题。
是否有任何优雅的方法来使用 SWIG 处理这些命名空间常量? 如果没有,有没有办法可以手动添加 Java 或 C# 类来定义它们?
最佳答案
我解决了 C++ - C# 的类似问题。我不确定这是否正是您正在寻找的内容,但我希望您会找到一些对您有用的信息。
我没有在我的项目中接触过 Java 代码。
痛饮解决方案。
我用 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 函数,您应该创建 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/