我有一些需要使用的遗留 C/C++ 头文件。这些头文件很大,我不想使用所有元素。是否可以仅读取该头文件的某些部分,如果可以,我将如何处理?
例如,下面是一个名为 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"
当我在上面运行 swig 时,它会生成两个 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"
您可以根据简单的名称匹配以外的方式指定要取消忽略的内容,例如正则表达式、命名空间、类型(类/模板/枚举/常量/...)
事实证明,我上面的基本示例几乎与 an example in the docs 相同.
关于java - 使用 Java 版 SWIG,如何有选择地获取巨大 C/C++ 头文件的某些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32146192/