我正在尝试包装一些用C++编写的库,以便使用SWIG与JAVA交互。
我在一个库中有一个C++结构,该库在另一个库的一个C++函数中用作参数。
common.h
namespace rina {
namespace cdap_rib {
typedef struct{
int size_;
void* message_;
} ser_obj_t;
}
}
该库经过包装,在JAVA中产生了一个称为
eu.irati.librina.ser_obj_t
的类。没关系。那我有utilities.h
class IPCPConfigEncoder {
public:
void encode (rina::cdap_rib::ser_obj_t& ser_obj);
}
用SWIG生产包装
public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) {
...
}
在JAVA类中。环顾四周,我发现了(SWIG Importing generated class from a different module and package into the current class),然后将其添加到.i
%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) {
...
}
然后,我有几个问题
import
已添加到所有java类中...如何将其仅包含在所需的类中? SWIGTYPE_p_rina__cdap_rib__ser_obj_t
更改为eu.irati.librina.ser_obj_t
。 注意:由于
common.h
和utilities.h
位于不同的库中,因此我无法将它们放在同一swig模块中。 最佳答案
正如@Felxo在评论中指出的那样,唯一的解决方案是告诉swig还了解其他库的接口(interface)包装(因此, header 及其包装方式)。
我做了什么:
common.i
复制到实用程序包装文件夹中。 utilities.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"
common.h
选项utilities.h
以及哪里-I