SWIG生成Java包装器时重复文件问题求助
解决SWIG多接口文件重复生成Java类的问题
方法1:用%import替代%include引入公共类型
SWIG的%include会将目标接口文件的内容完全嵌入当前接口,导致重复生成包装类;而%import仅告知SWIG类型的定义信息,不会重复生成对应的Java类。
修改Example.i内容如下:
/* Example.i */ %module Example // 用%import替代%include,仅引入Common.hpp的类型定义 %import "Common.hpp" %include "Example.hpp"
编译时需注意:生成Example的包装器后,编译C++代码时要链接Common的包装器文件(swig_Common_wrapper.cpp),确保依赖的类型实现存在。
方法2:拆分公共接口为纯类型声明文件
将公共类型的声明与模块定义分离,避免模块重复引入导致的类重复生成:
- 创建
CommonTypes.i(仅包含类型声明,无%module):
/* CommonTypes.i */ %include "Common.hpp"
- 修改
Common.i引用该声明文件:
/* Common.i */ %module Common %include "CommonTypes.i"
- 修改
Example.i用%import引入类型声明:
/* Example.i */ %module Example %import "CommonTypes.i" %include "Example.hpp"
方法3:指定公共类的固定包路径
通过SWIG的类型映射,告知Example接口中公共类的包路径,让SWIG直接引用已生成的类而非重新生成:
/* Example.i */ %module Example // 指定A、B类所属的包,与Common接口生成的包一致 %typemap(javapackage) A "com.wrappers.Common"; %typemap(javapackage) B "com.wrappers.Common"; %import "Common.hpp" %include "Example.hpp"
这样生成Example的Java代码时,会直接使用com.wrappers.Common.A和com.wrappers.Common.B,不会在com.wrappers.Example包下重复生成。
内容的提问来源于stack exchange,提问作者AnDevi
相关产品推荐
相关产品推荐

