1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
我會(huì)更改此接口并使用 C++ 容器(或迭代器/范圍,但在 SWIG 中不太支持)。從 SWIG 3.1(或者可能是 4.x?)開始,兩者std::vector都std::list應(yīng)該正確地實(shí)現(xiàn)合理的 Java 接口和自動(dòng)裝箱原語(yǔ)。所以你的界面可能變成這樣:
class SubwordEncoder {
public:
std::vector<int> encode(const std::vector<char>& decoded);
std::vector<char> decode(const std::vector<int>& encoded);
};
然后你可以用這個(gè)包裝:
/* File : example.i */
%module encoder
%include <std_vector.i>
%{
#include "SubwordEncoder.h"
%}
%template(IntVector) std::vector<int>;
%template(CharVector) std::vector<char>;
/* Let's just grab the original header file here */
%include "SubwordEncoder.h"
這有兩件事。首先,它引入了 SWIG 庫(kù)對(duì)std::vector. 其次,它用于%template告訴 SWIG 使用兩種類型顯式實(shí)例化和包裝向量模板。這些在 Java 中被賦予了合理的名稱。
有了它,安全地實(shí)現(xiàn)您在這里嘗試做的事情應(yīng)該非常簡(jiǎn)單。
需要注意的是,從byte[]或int[]另一個(gè) Java 集合的自動(dòng)轉(zhuǎn)換不會(huì)自動(dòng)發(fā)生在函數(shù)輸入上。如果該行為對(duì)您很重要/有用,則可以創(chuàng)建一個(gè)接口來(lái)執(zhí)行此操作,但它需要更多的類型映射和 JNI 調(diào)用。
添加回答
舉報(bào)