1 回答

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