我有一个要在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,稍后将其填充到程序中。
答案 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示例中的调用中删除了不正确的转换,它就应该可以工作。