SWIG:使用导入的外部类型
SWIG: using imported external type
我正在尝试包装一些用c++编写的库,以便使用SWIG与JAVA接口。
一个库中的一个c++结构体在另一个库的一个c++函数中用作参数。
构成
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从不同的模块和包导入生成的类到当前类),我添加到。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类中…我怎样才能把它只寄给想要的类呢?如何告诉SWIG将
SWIGTYPE_p_rina__cdap_rib__ser_obj_t
改为eu.irati.librina.ser_obj_t
注意:由于common.h
和utilities.h
在不同的库中,我不能把它们放在同一个swig模块中。
正如@Felxo在评论中指出的那样,唯一的解决方案是告诉swig也理解其他库的接口包装(所以头文件以及它们是如何包装的)。
我做了什么:
- 我将
我添加到
utilities.i
/* this is the "copied" common.i */ %import "common.i" %pragma(java) jniclassimports=%{ import eu.irati.librina.ser_obj_t; %}
添加代理类的导入(您应该将thai更改为从java路径指向您的代理类)
从复制的
common.i
中删除不必要的指令,如%template
,请记住,此时,您只是"导入"common.h,而不是包装它(您之前已经包装了它)。实际上,common.i
应该只包括:%{ #include "common.h" }%
但没有
%include "common.h"
- 使用
-I
选项告诉SWIGcommon.h
在哪里以及utilities.h
在哪里
common.i
复制到实用程序包装文件夹中。相关文章:
- 调用外部函数,无法指定类型 C++/MVS
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 外部基础类型未按请求对齐时的atomic_ref
- Pybind11:作为返回值的外部类型
- C++:在"try"外部创建的类型会导致错误,但在内部不会
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 函数类型定义可以与外部"C"相关联吗?
- 从内部类型参数推断外部类型
- 使用从外部参数包中获取的参数类型声明函数
- 为什么对非类型模板参数的引用需要外部链接
- 获取外部媒体类型
- 外部函数指针声明和类型推断定义
- C++:检查是否在没有外部库的情况下抛出了某个异常类型
- 外部模板,用于使用非竞争类型参数化的模板
- 可变类型的部分模板专门化和扩展到外部类型的可变参数包会导致歧义
- C 中的外部类型声明冲突
- SWIG:使用导入的外部类型
- 无法读取外部类型和资源系统的文件
- 如何在C++中推导内部类型的外部类型
- 当使用许多外部类型声明时,如何加快编译时间?