将 SWIG 用于 Java,我如何有选择地 swig 一个巨大的 C/C++ 头文件的某些部分?
Using SWIG for Java, how can I selectively swig certain parts of a huge C/C++ header file?
我有一些遗留的 C/C++ 头文件需要使用。这些头文件很大,我不想痛饮所有的元素。是否可以只 swig 那个头文件的某些部分,如果可以,我该怎么做?
例如,这里有一个名为 BigHeaderFile.h 的 C 头文件,带有枚举声明:
#ifndef __HEADER_GUARD__
#define __HEADER_GUARD__
typedef enum _MYSTATUS {
OK, NG, NONE
} MYSTATUS;
typedef enum _NOTINTERESTED {
AVAL, BVAL, CVAL
} NOTINTERESTED;
#endif __HEADER_GUARD__
下面是我的 swig 文件:
%module MyNativeClass
%include "enums.swg"
%javaconst(1);
%include "BigHeaderFile.h"
当我 运行 痛饮上面的内容时,它会生成两个 java 类 MYSTATUS 和 NOTINTERESTED。有没有办法告诉 swig 只为 MYSTATUS 生成 java 枚举?
您几乎肯定在寻找 SWIG's advanced renaming 功能。
您可以使用以下方法开始解决此问题:
%rename("$ignore") "";
让 SWIG 忽略头文件中的所有声明。完成后,您可以有选择地重新启用任何您认为合适的包装。
因此您的 .i 文件变为:
%module MyNativeClass
%include <enums.swg>
%javaconst(1);
%rename("$ignore") ""; // ignore all
%rename("%s") "MYSTATUS"; // except MYSTATUS
%include "BigHeaderFile.h"
您可以根据不仅仅是简单的名称匹配来指定要取消忽略的内容,例如正则表达式、命名空间、类型 (class/template/enum/constness/...)
事实证明,我上面的基本示例与an example in the docs几乎相同。
我可以想到两种方法:
复制文件 BigHeaderFile.h,将其重命名为 BigHeaderFile.i,删除不需要 swig 包装器的部分,并在 swig 文件中 %include "BigHeaderFile.i"
代替。
在 swig 文件中包含文件 BigHeaderFile.h 之前,使用 %ignore NOTINTERESTED;
告诉 swig 忽略 NOTINTERESTED。然后 Swig 将不会为 class.
生成包装器
请注意,无论哪种情况,您都可能需要添加
%{
#include "BigHeaderFile.h"
%}
添加到 swig 文件的顶部,以便将此行放入包装器代码中。否则,它不应该编译。
我有一些遗留的 C/C++ 头文件需要使用。这些头文件很大,我不想痛饮所有的元素。是否可以只 swig 那个头文件的某些部分,如果可以,我该怎么做?
例如,这里有一个名为 BigHeaderFile.h 的 C 头文件,带有枚举声明:
#ifndef __HEADER_GUARD__
#define __HEADER_GUARD__
typedef enum _MYSTATUS {
OK, NG, NONE
} MYSTATUS;
typedef enum _NOTINTERESTED {
AVAL, BVAL, CVAL
} NOTINTERESTED;
#endif __HEADER_GUARD__
下面是我的 swig 文件:
%module MyNativeClass
%include "enums.swg"
%javaconst(1);
%include "BigHeaderFile.h"
当我 运行 痛饮上面的内容时,它会生成两个 java 类 MYSTATUS 和 NOTINTERESTED。有没有办法告诉 swig 只为 MYSTATUS 生成 java 枚举?
您几乎肯定在寻找 SWIG's advanced renaming 功能。
您可以使用以下方法开始解决此问题:
%rename("$ignore") "";
让 SWIG 忽略头文件中的所有声明。完成后,您可以有选择地重新启用任何您认为合适的包装。
因此您的 .i 文件变为:
%module MyNativeClass
%include <enums.swg>
%javaconst(1);
%rename("$ignore") ""; // ignore all
%rename("%s") "MYSTATUS"; // except MYSTATUS
%include "BigHeaderFile.h"
您可以根据不仅仅是简单的名称匹配来指定要取消忽略的内容,例如正则表达式、命名空间、类型 (class/template/enum/constness/...)
事实证明,我上面的基本示例与an example in the docs几乎相同。
我可以想到两种方法:
复制文件 BigHeaderFile.h,将其重命名为 BigHeaderFile.i,删除不需要 swig 包装器的部分,并在 swig 文件中
%include "BigHeaderFile.i"
代替。在 swig 文件中包含文件 BigHeaderFile.h 之前,使用
%ignore NOTINTERESTED;
告诉 swig 忽略 NOTINTERESTED。然后 Swig 将不会为 class. 生成包装器
请注意,无论哪种情况,您都可能需要添加
%{
#include "BigHeaderFile.h"
%}
添加到 swig 文件的顶部,以便将此行放入包装器代码中。否则,它不应该编译。