c# - SWIG 中的命名空间常量

标签 c# java c++ swig

问题相当简单,我在 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/

相关文章:

c++ - 函数中的变量初始化错误

c++ - 如何在 wxListCtrl (wxwidgets) 中上下移动一个项目

c++ - 如何在 boost::uint8_t 中存储零值

c# - 将输出引用程序集构建到子文件夹

c# - 需要重构大类的建议

C# 测量转换类

c# - 如何使用emgu cv在图像中找到具有任意旋转角度的黑色方 block

java - CLI 测试失败,传入 IDE - 加载资源

java - 为什么Java的GUI平台命名为 "Swing?"

java - 简单-XML : Overriding an element name at runtime