我的情況是,我有一個C++類(MyClass的)與具有以下簽名的方法:痛飲:返回類型的std :: string(二進制)轉換成Java字節[]
bool getSerialized(const stdString & name, std::string & serialized);
其中name是一個參數,序列化是一個失敗的論點。
我得到了它的製作%的工作延伸和%忽略「我」文件聲明如下:
%extend MyClass{
std::string getSerialized(const std::string & name){
std::string res;
$self->getSerialized(name, res);
return res;
};
%rename("$ignore", fullname=1) "MyClass::getSerialized";
所以該方法從Java中使用CON,如:
MyClass mc = new MyClass();
String res = mc.getSerialized("test");
但現在我已經遇到了一個問題,序列化的std :: string包含二進制數據,包括「\ 0」字符女巫表示C字符串的結尾,其實下面的代碼顯示了C++的問題:
std::string s;
s.push_back('H');
s.push_back('o');
s.push_back(0);
s.push_back('l');
s.push_back('a');
std::cout << "Length of std::string " << s.size() << std::endl;
std::cout << "CString: '" << s.c_str() << "'" << std::endl;
上述顯示器的代碼:
Length of std::string 5
CString: 'Ho'
正如我在由SWIG產生的渦卷文件所看到的,包裝方法實際調用c_str(),渦卷的代碼:
jstring jresult = 0 ;
std::string result;
result = (arg1)->getSerialized();
jresult = jenv->NewStringUTF((&result)->**c_str()**);
return jresult;
因此,作爲預計在Java中收到的字符串會被截斷。所以我怎麼能改變(大概)我的%擴展函數包裝,所以我可以返回這個字節數組(字節[]),而不需要事先知道數組的長度。這將是巨大的,如果字節組可在痛飲層來創建,所以我可以從Java調用的方法,如:
byte[] serialized = mc.getSerialized("test");
其他注意事項: 用於存儲二進制數據給出了使用的std :: string的,正如使用Google protobuf庫的返回類型一樣,有一個非常類似的問題,其中包括tittle Swig: convert return type std::string to java byte[],但沒有二進制數據的情況,所以在此給出的解決方案在此不適用。
使用痛飲2.
輸出參數的長度是否可預測?即你可以知道電話之前的長度嗎? – Flexo