簡體   English   中英

使用SWIG for Java,如何選擇性地對巨大的C / C ++頭文件的某些部分進行緩存?

[英]Using SWIG for Java, how can I selectively swig certain parts of a huge C/C++ header file?

我有一些舊的C / C ++頭文件需要使用。 這些頭文件很大,我不想s繞所有元素。 是否可以只對頭文件的某些部分進行緩存,如果可以,我將如何處理?

例如,這是一個名為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的高級重命名功能。

您可以開始使用以下方法解決此問題:

%rename("$ignore") "";

使SWIG忽略頭文件中的所有聲明。 完成后,您可以有選擇地重新啟用對您認為合適的任何內容的包裝。

因此,您的.i文件變為:

%module MyNativeClass
%include <enums.swg>
%javaconst(1);

%rename("$ignore") ""; // ignore all
%rename("%s") "MYSTATUS"; // except MYSTATUS

%include "BigHeaderFile.h"

您不僅可以基於簡單的名稱匹配來指定要忽略的內容,例如正則表達式,名稱空間,類型(類/模板/枚舉/常量/ ...)

事實證明,我上面的基本示例幾乎與docs中的示例相同。

我可以想到兩種方法:

  1. 制作文件BigHeaderFile.h的副本,將其重命名為BigHeaderFile.i,刪除不希望使用Swig包裝程序的部件,並在%include "BigHeaderFile.i"文件%include "BigHeaderFile.i"

  2. 在swig文件中包含文件BigHeaderFile.h之前,請使用%ignore NOTINTERESTED; 告訴swig忽略NOTINTERESTED。 這樣,Swig將不會為該類生成包裝器。

請注意,無論哪種情況,您都可能需要添加

%{ 
#include "BigHeaderFile.h"
%}

到swig文件的頂部,以便將此行放入包裝器代碼中。 否則,不應編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM