SWIG:使用导入的外部类型

SWIG: using imported external type

本文关键字:外部 类型 导入 SWIG      更新时间:2023-10-16

我正在尝试包装一些用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) {
    ...
}

然后,我有几个问题

  1. import被添加到所有java类中…我怎样才能把它只寄给想要的类呢?

  2. 如何告诉SWIG将SWIGTYPE_p_rina__cdap_rib__ser_obj_t改为eu.irati.librina.ser_obj_t

注意:由于common.hutilities.h在不同的库中,我不能把它们放在同一个swig模块中。

正如@Felxo在评论中指出的那样,唯一的解决方案是告诉swig也理解其他库的接口包装(所以头文件以及它们是如何包装的)。

我做了什么:

    我将common.i复制到实用程序包装文件夹中。
  1. 我添加到utilities.i

    /* this is the "copied" common.i */
    %import "common.i"
    %pragma(java) jniclassimports=%{
    import eu.irati.librina.ser_obj_t;
    %}
    

    添加代理类的导入(您应该将thai更改为从java路径指向您的代理类)

  2. 从复制的common.i中删除不必要的指令,如%template,请记住,此时,您只是"导入"common.h,而不是包装它(您之前已经包装了它)。实际上,common.i应该只包括:

     %{
        #include "common.h"
     }%
    

    但没有

     %include "common.h"
    

  3. 使用-I选项告诉SWIG common.h在哪里以及utilities.h在哪里