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) {
    ...
}

那么,我有几个问题

  1. import 被添加到所有 java classes... 我如何才能将它仅包含到所需的 class?

  2. 如何让 SWIG 将 SWIGTYPE_p_rina__cdap_rib__ser_obj_t 更改为 eu.irati.librina.ser_obj_t

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

正如@Felxo 在评论中指出的那样,唯一的解决方案是让 swig 了解其他库接口包装(所以 headers 以及它们是如何包装的)。

我做了什么:

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

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

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

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

     %{
        #include "common.h"
     }%
    

    但没有

     %include "common.h"
    
  4. 使用 -I 选项
  5. 告诉 SWIG common.h 以及 utilities.h 在哪里