swig java中的简单类型映射示例

时间:2010-05-12 04:00:20

标签: java java-native-interface native swig

我正在尝试使用swig包装本机C ++库,并且我一直试图将C中的time_t转换为Java中的long。我已成功使用swig与python,但到目前为止,我无法让上面的typemap在Java中工作。 在python中它看起来像这样

%typemap(in) time_t
{
    if (PyLong_Check($input))
        $1 = (time_t) PyLong_AsLong($input);
    else if (PyInt_Check($input))
        $1 = (time_t) PyInt_AsLong($input);
    else if (PyFloat_Check($input))
        $1 = (time_t) PyFloat_AsDouble($input);
    else {
        PyErr_SetString(PyExc_TypeError,"Expected a large number");
        return NULL;
    }
}

%typemap(out) time_t
{
    $result = PyLong_FromLong((long)$1);
}

我想从Java到C的地图将是:

%typemap(in) time_t {
    $1 = (time_t) $input;
}

我如何完成从C到Java的外图?

%typemap(out) time_t ???

我是否需要类似下面的打字机?

%typemap(jni) 
%typemap(jtype) 
%typemap(jstype) 

我需要这个来包装像这样的C函数:

time_t manipulate_time (time_t dt);

2 个答案:

答案 0 :(得分:9)

您应该看一下swig文档的这些部分:

在基本类型映射中还有很多“示例”,它们是为原始类型实现的。您可以在 \ swig \ Lib \ java \ java.swg 中找到它们 我不知道这是否有效,但也许这样的事情会满足你的需求?

%typemap(jni) time_t "jlong"
%typemap(jtype) time_t "long"
%typemap(jstype) time_t "long"

%typemap(out) time_t %{ $result = (jlong)$1; %}
%typemap(in) time_t "(time_t)$input"

答案 1 :(得分:0)

您可以简单地执行,而不是使用文字地图。

typedef long long time_t;