java - 使用 Java 版 SWIG,如何有选择地获取巨大 C/C++ 头文件的某些部分?

标签 java c++ c swig

我有一些需要使用的遗留 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/

相关文章:

java - Quarkus - 扩展包括第 3 方 ContainerRequestFilter

java - 将文件列表与对象列表进行比较以删除文件

c++ - 递归打印 n, n-1, n-2,...3,2,1,2,3,...n

c - 在C中将int值添加到字符串中

java - Eclipse 无法创建新的 AVD

java - 将 RGB PNG 转换为 CMYK JPEG(使用 ICC 颜色配置文件)

c++ - boost::filesystem - 如何在 posix 平台上从 Windows 路径字符串创建 boost 路径?

c++ - 为什么打开 QMessageBox 时 Irrlicht 窗口变黑?

c - 如何使用 C 中的循环找到满足 (x - y * sqrt(2016.0))/(y + sqrt(2016.0)) = 2016 的数字

c - 如何理解汇编级别的原子 test_and_set?