Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIG:使用导入的外部类型 我试图用C++编写一些用java编写的库,用SWIG与Java接口。p> 我在一个库中有一个C++结构,它是用另一个库的一个C++函数作为参数。_Java_C++_Swig - Fatal编程技术网

SWIG:使用导入的外部类型 我试图用C++编写一些用java编写的库,用SWIG与Java接口。p> 我在一个库中有一个C++结构,它是用另一个库的一个C++函数作为参数。

SWIG:使用导入的外部类型 我试图用C++编写一些用java编写的库,用SWIG与Java接口。p> 我在一个库中有一个C++结构,它是用另一个库的一个C++函数作为参数。,java,c++,swig,Java,C++,Swig,common.h namespace rina { namespace cdap_rib { typedef struct{ int size_; void* message_; } ser_obj_t; } } 这个库被包装起来,在JAVA中生成一个名为eu.irati.librina.ser_obj_t的类。那很好。那我有 实用程序.h class IPCPConfigEncoder { public:

common.h

namespace rina {
    namespace cdap_rib {
        typedef struct{
        int size_;
        void* message_;
        } ser_obj_t;
    }
}
这个库被包装起来,在JAVA中生成一个名为
eu.irati.librina.ser_obj_t
的类。那很好。那我有

实用程序.h

class IPCPConfigEncoder {
    public:
        void encode (rina::cdap_rib::ser_obj_t& ser_obj);
}
里面包着大口大口的水

  public void encode(SWIGTYPE_p_rina__cdap_rib__ser_obj_t ser_obj) {
    ...
}
在JAVA类中。在中查找,我发现()并添加到

%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) {
    ...
}
然后,我有几个问题

  • 导入将添加到所有java类中。。。我怎样才能将其仅包含在所需的类中

  • 我如何告诉瑞士政府更改
    eu.irati.librina.ser\u obj\t的
    SWIGTYPE\u p\u rina\u cdap\u rib\u ser\u obj\t


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

    正如@Felxo在文章中指出的那样,唯一的解决方案是告诉swig也要理解其他库的接口包装(所以标题和它们是如何包装的)

    我所做的:

  • 我将
    common.I
    复制到实用程序包装文件夹中
  • 我添加到
    实用程序中。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"
    
  • 使用
    -I
    选项告诉SWIG
    common.h
    以及
    utilities.h
    在哪里

  • 我的例子是:为你解决这个问题吗?问题是,两者都是放在不同文件夹中的不同模块。当我导入另一个时,它找不到包含项,因为两个包含项似乎必须在同一个文件夹中。您可以使用-I标志SWIG来设置包含项搜索路径。是的,这很有效(加上一些更改),但谢谢,感谢你的贡献,我正在回答我自己的问题。你应该自己写一个答案,这样将来的读者也能从中受益。