SWIG:使用导入的外部类型
SWIG: using imported external type
我正在尝试包装一些用 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
的 class。没关系。然后我有
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 class 中。环顾四周,我发现 (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 classes... 我如何才能将它仅包含到所需的 class?
如何让 SWIG 将 SWIGTYPE_p_rina__cdap_rib__ser_obj_t
更改为 eu.irati.librina.ser_obj_t
。
注意:由于 common.h
和 utilities.h
在不同的库中,我无法将它们放在同一个 swig 模块中。
正如@Felxo 在评论中指出的那样,唯一的解决方案是让 swig 了解其他库接口包装(所以 headers 以及它们是如何包装的)。
我做了什么:
- 我将
common.i
复制到实用程序包装文件夹中。
我加进了utilities.i
/* this is the "copied" common.i */
%import "common.i"
%pragma(java) jniclassimports=%{
import eu.irati.librina.ser_obj_t;
%}
添加代理的导入 class(您应该将泰语更改为从 java 路径指向您的代理 class)
从复制的common.i
中删除%template
等不必要的指令,记住,此时,你只是"importing" common.h ,而不是包装它(你之前已经包装过了)。实际上,common.i
应该只包括:
%{
#include "common.h"
}%
但没有
%include "common.h"
- 使用
-I
选项 告诉 SWIG common.h
以及 utilities.h
在哪里
我正在尝试包装一些用 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
的 class。没关系。然后我有
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 class 中。环顾四周,我发现 (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 classes... 我如何才能将它仅包含到所需的 class?如何让 SWIG 将
SWIGTYPE_p_rina__cdap_rib__ser_obj_t
更改为eu.irati.librina.ser_obj_t
。
注意:由于 common.h
和 utilities.h
在不同的库中,我无法将它们放在同一个 swig 模块中。
正如@Felxo 在评论中指出的那样,唯一的解决方案是让 swig 了解其他库接口包装(所以 headers 以及它们是如何包装的)。
我做了什么:
- 我将
common.i
复制到实用程序包装文件夹中。 我加进了
utilities.i
/* this is the "copied" common.i */ %import "common.i" %pragma(java) jniclassimports=%{ import eu.irati.librina.ser_obj_t; %}
添加代理的导入 class(您应该将泰语更改为从 java 路径指向您的代理 class)
从复制的
common.i
中删除%template
等不必要的指令,记住,此时,你只是"importing" common.h ,而不是包装它(你之前已经包装过了)。实际上,common.i
应该只包括:%{ #include "common.h" }%
但没有
%include "common.h"
- 使用
-I
选项 告诉 SWIG
common.h
以及 utilities.h
在哪里