gpt4 book ai didi

java - SWIG 更改函数签名

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:53 27 4
gpt4 key购买 nike

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

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

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

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

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

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

%typemap(jstype) TCustomElementList "long[]"

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

感谢您的任何想法。

最佳答案

你的类型映射是正确的,但你需要的不仅仅是那个:

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

(此接口(interface)通过 SWIG 运行良好,但尚未经过进一步测试)。

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

关于java - SWIG 更改函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com