编程语言
首页 > 编程语言> > java-SWIG更改功能签名

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类型的新对象.

感谢您的任何想法.

解决方法:

您的Typemap处在正确的位置,但是您需要的不只是那几个:

%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();
};

(此接口运行良好,但未经过进一步测试).

您需要同时为Proxy类和JNI类设​​置返回类型(jtype和jstype typemaps).您还需要指示代理传递JNI代码返回的内容(javaout类型映射).然后,您需要提供一些JNI粘合代码,将其插入以在C端创建新的Java数组(输出类型映射).

标签:swig,java
来源: https://codeday.me/bug/20191201/2078410.html