[英]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中的示例相同。
我可以想到兩種方法:
制作文件BigHeaderFile.h的副本,將其重命名為BigHeaderFile.i,刪除不希望使用Swig包裝程序的部件,並在%include "BigHeaderFile.i"
文件%include "BigHeaderFile.i"
。
在swig文件中包含文件BigHeaderFile.h之前,請使用%ignore NOTINTERESTED;
告訴swig忽略NOTINTERESTED。 這樣,Swig將不會為該類生成包裝器。
請注意,無論哪種情況,您都可能需要添加
%{
#include "BigHeaderFile.h"
%}
到swig文件的頂部,以便將此行放入包裝器代碼中。 否則,不應編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.