我試圖從C++傳遞一個輸入和一個輸出緩衝區到Java類。 爲了提高效率,我需要使用ByteBuffer。SWIG typemap uint8_t * from C/C++ to java.nio.ByteBuffer
這兩個緩衝區都分配在C++部分中,我需要將它們傳遞給一個java函數,該函數將使用輸入緩衝區進行一些計算並將結果寫入輸出緩衝區。
這裏是的C++如何看起來像一個簡化的例子:
// SWIG mapped with %feature("director") JavaDelegate;
class JavaDelegate {
public:
JavaDelegate() {}
virtual ~JavaDelegate() {}
virtual int compute(const uint8_t* input, size_t inSize,
uint8_t* output, size_t maxOutSize,
int someFlag) = 0;
};
// assume inputBuf is filled with valid data
std::vector<uint8_t> inputBuf;
std::vector<uint8_t> outputBuf(10000);
// delegate also points to a valid SWIG mapped class
JavaDelegate* delegate;
void computeOutput() {
int someFlag = 1;
int numValuesComputed = delegate->compute(inputBuf.data(), inputBuf.size(),
outputBuf.data(), outputBuf.size(),
someFlag);
std::cout << "Computed " << numValuesComputed << " value from input.\n";
}
在Java端,我要實現這一點(JavaDelegate
類已通過SWIG生成):
public class Delegate extends JavaDelegate {
public long compute(java.nio.ByteBuffer input,
java.nio.ByteBuffer output,
long someFlag)
{
// read input
// compute something n values from m input values
// write result to output
return numOutputValues;
}
}
問題是,我簡直無法弄清楚如何將類型映射包裝成一個簡單的char *到一個ByteBuffer,特別是與爲抽象基類打開的SWIG的導向器功能相結合。 我知道如何將ByteBuffer從Java傳遞到C++,但我無法找到如何做相反的事情。
任何幫助表示讚賞!
我會通過一個DirectByteBuffer從Java到C++爲它填充,可避免通過改變地址和容量複製數據。 –
輸出緩衝區實際上是一個硬件緩衝區,所以我無法真正從java分配它。當然,我可以在之後將它複製回硬件緩衝區,但如果可能的話,我寧願直接將其直接映射到Java。 – pokey909
http://stackoverflow.com/questions/15414753/shared-memory-between-c-and-java-processes –