SWIG更改功能签名

时间:2012-07-02 08:27:41

标签: java swig

我正在使用Swig创建Java接口。基本上,在C ++中我有模板(

template<class T> class TSizedArray
{
    int GetLength();
    T* GetElements() const;
    ...
}

class Producer
{
    TSizedArray<long> GetLongs();
    ...
}

此模板用作我需要通过SWIG导出到Java的API的某些功能的返回值。但是,在Java中,我们希望使用本机Java数组而不是这个简单的包装器:

Java:
    long[] result = Producer.GetLongs();

我不确定如何使用SWIG实现这一目标。该模板具有多个实例,并用作不同类中多个方法的输入和输出。我能够使用:

%typemap(jstype) TCustomElementList "long[]"

将生成的Java接口作为long [] GetLongs()获取,但生成的实现创建TCustomElementList类型的新对象。

感谢任何想法。

1 个答案:

答案 0 :(得分:3)

您使用的是类型图,但是您需要的不仅仅是那个:

%module test

template<class T> class TSizedArray
{
public:
    int GetLength();
    T* GetElements() const;
};

%typemap(jstype) TSizedArray<long> "long[]"
%typemap(jtype) TSizedArray<long> "long[]"
%typemap(javaout) TSizedArray<long> {
    return $jnicall;
  }

%typemap(out) TSizedArray<long> {
  $result = JCALL1(NewLongArray, jenv, $1->GetLength());
  JCALL4(SetLongArrayRegion, jenv, $result, 0, $1->GetLength(), $1->GetElements());
}

class Producer
{
public:
    TSizedArray<long> GetLongs();
};

(此界面通过SWIG运行正常,但尚未经过进一步测试)。

您需要为Proxy类和JNI类(jtype和jstype类型映射)设置返回类型。您还需要指示代理通过JNI代码返回的内容(javaout typemap)。然后你需要提供一些JNI粘合代码,这些代码被插入以在C ++端创建一个新的Java数组(out typemap)。