SWIG:使用导入的外部类型 我试图用C++编写一些用java编写的库,用SWIG与Java接口。p> 我在一个库中有一个C++结构,它是用另一个库的一个C++函数作为参数。
common.hSWIG:使用导入的外部类型 我试图用C++编写一些用java编写的库,用SWIG与Java接口。p> 我在一个库中有一个C++结构,它是用另一个库的一个C++函数作为参数。,java,c++,swig,Java,C++,Swig,common.h namespace rina { namespace cdap_rib { typedef struct{ int size_; void* message_; } ser_obj_t; } } 这个库被包装起来,在JAVA中生成一个名为eu.irati.librina.ser_obj_t的类。那很好。那我有 实用程序.h class IPCPConfigEncoder { public:
namespace rina {
namespace cdap_rib {
typedef struct{
int size_;
void* message_;
} ser_obj_t;
}
}
这个库被包装起来,在JAVA中生成一个名为eu.irati.librina.ser_obj_t
的类。那很好。那我有
实用程序.h
class IPCPConfigEncoder {
public:
void encode (rina::cdap_rib::ser_obj_t& ser_obj);
}
里面包着大口大口的水
public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) {
...
}
在JAVA类中。在中查找,我发现()并添加到
%typemap(javaimports) SWIGTYPE
%{
import eu.irati.librina.ser_obj_t;
%}
产生
import eu.irati.librina.ser_obj_t;
public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) {
...
}
然后,我有几个问题
eu.irati.librina.ser\u obj\t的SWIGTYPE\u p\u rina\u cdap\u rib\u ser\u obj\t
注意:由于
common.h
和utilities.h
在不同的库中,我不能将它们放在同一个swig模块中。正如@Felxo在文章中指出的那样,唯一的解决方案是告诉swig也要理解其他库的接口包装(所以标题和它们是如何包装的)
我所做的:
common.I
复制到实用程序包装文件夹中实用程序中。I
/* this is the "copied" common.i */
%import "common.i"
%pragma(java) jniclassimports=%{
import eu.irati.librina.ser_obj_t;
%}
要添加代理类的导入(您应该将thais更改为从java路径指向代理类)common.i
中删除不必要的指令,如%template
,请记住,此时,您只是“导入”common.h,而不是包装它(您以前已经包装过它)。实际上,common.i
应该只包括:
%{
#include "common.h"
}%
但是没有
%include "common.h"
-I
选项告诉SWIGcommon.h
以及utilities.h
在哪里我的例子是:为你解决这个问题吗?问题是,两者都是放在不同文件夹中的不同模块。当我导入另一个时,它找不到包含项,因为两个包含项似乎必须在同一个文件夹中。您可以使用-I标志SWIG来设置包含项搜索路径。是的,这很有效(加上一些更改),但谢谢,感谢你的贡献,我正在回答我自己的问题。你应该自己写一个答案,这样将来的读者也能从中受益。