我正在尝试包装一些用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类中...如何将其仅包含在所需的类中?
  • 如何告诉SWIG将SWIGTYPE_p_rina__cdap_rib__ser_obj_t更改为eu.irati.librina.ser_obj_t

  • 注意:由于common.hutilities.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选项
  • 告诉SWIG哪里是utilities.h以及哪里-I

    09-05 19:29
    查看更多