使用SWIG进行不兼容的类型转换

时间:2018-11-05 11:09:05

标签: java c++ swig

我有一个要在Java下使用的C ++库。为了很好地模仿它,我尝试在界面typedefs SWIG文件中使用.i。我很难将泛型转换为Java。到目前为止,我在.i接口文件中有这样的代码:

%module api
%{
    #include "api.h"

    typedef unsigned __int64 Tint64u;
    typedef Tint64u TContext_t;
%}
%include "api.h"

%apply unsigned long long { unsigned __int64 };

typedef unsigned __int64 Tint64u;
typedef Tint64u TContext_t;

在我的C ++类下,我有这样的类,其中的一种方法将TContext_t作为输入参数:

class APIClass {

public:
    APIClass();
    void test(TContext_t context);

};

我使用SWIG对其进行了编译,并且在Java下,我尝试使用这种方法,如下所示:

class main {
    public static void main(String[] args) {
        System.loadLibrary("api");
        APIClass api = new APIClass();
        api.test((SWIGTYPE_p_unsigned___int64) BigInteger.valueOf(0));
    }
}

但是在这里,我得到一个错误BigInteger cannot be converted to SWIGTYPE_p_unsigned___int64。我在接口文件中缺少什么,以便可以开始将数字值传递到test()方法中?对于初学者,我想将其初始化为0,稍后将其填充到程序中。

1 个答案:

答案 0 :(得分:0)

您在这里按错误的顺序排列了东西。当SWIG通过%include指令看到您的头文件时,它根本不知道TContext_t到底是什么。这是因为它逐行处理每个事物。因此,最终它会随着时间的流逝而产生一些东西,而这几乎总是您所不想要的。您可以在此处找到它,因为它生成的方法的类型名称以SWIGTYPE_开头。

但是修复应该很简单。如果您将.i文件的顺序更改为这样:

%module api
%{
    #include "api.h"

    typedef unsigned __int64 Tint64u;
    typedef Tint64u TContext_t;
%}
%apply unsigned long long { unsigned __int64 };

typedef unsigned __int64 Tint64u;
typedef Tint64u TContext_t;

%include "api.h"

然后,只要您还从Java示例中的调用中删除了不正确的转换,它就应该可以工作。