SWIG - 如何忽略我不需要公开的 C++ 类(在 Java 中)?

Posted

技术标签:

【中文标题】SWIG - 如何忽略我不需要公开的 C++ 类(在 Java 中)?【英文标题】:SWIG - How to ignore C++ classes I don't need to expose (in Java)? 【发布时间】:2014-03-21 14:12:14 【问题描述】:

考虑一个声明了以下函数的SomeClass.h

void doSomethingSimple(double);
void dealWithComplexClasses(ComplexClass&);

我想在 Java 中公开doSomethingSimple(double),但不想公开dealWithComplexClasses(ComplexClass&)

我尝试了各种方法,例如:

%ignore SomeClass::dealWithComplexClasses(ComplexClass&);
%ignore SomeClass::dealWithComplexClasses;

我还找到了this SO question,它得到了回答,但没有帮助我(虽然问题很相似,所以我一定遗漏了一些东西) 但最终 Swig 总是为 ComplexClass 创建一个代理 java 类,并且在 SomeClass.java 中有一个 dealWithComplexClasses(SWIGTYPE_p_ComplexClass class)

我如何告诉 Swig 只为我想在 Java 中公开的内容生成代码?或者忽略我不想公开的函数和类?

【问题讨论】:

请注意,如果您不依附于 swig,Boost.Python 可以很好地完成这类事情。 【参考方案1】:

你在做正确的事。 %ignore SomeClass::dealWithComplexClasses 应该可以工作,所以我怀疑您正在同时尝试其他事情并将错误解释为表明这没有工作的迹象。试试:

%ignore ComplexClass; // will not wrap ComplexClass
%ignore SomeClass::dealWithComplexClasses; // do not wrap that method or any of its overloads

另一种可能但无法从您的帖子中看出,您的类位于命名空间中。在这种情况下,您需要预先添加名称空间。

如果它仍然不起作用,需要更多信息,为此发布一个最小的 .i 和 .h。

【讨论】:

【参考方案2】:

您可以直接在 C++ 代码中使用预处理工具:

void doSomethingSimple(double);
#ifndef SWIGJAVA
void dealWithComplexClasses(ComplexClass&);
#endif

见:http://www.swig.org/Doc1.3/Preprocessor.html#Preprocessor_condition_compilation

【讨论】:

以上是关于SWIG - 如何忽略我不需要公开的 C++ 类(在 Java 中)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 swig 使 C++ 类看起来像一个 numpy 数组

如何在 Python 中处理 SWIG 导向器方法中的 void 指针

SWIG 和 C++ 枚举类

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

swig 对基类“std::string”一无所知,被忽略

如何使用 swig 将 python 类实例作为 c++ 函数的参数传递?