Ich versuche, einen Eingabe- und einen Ausgabepuffer an eine Java-Klasse von C++ zu übergeben. Aus Effizienzgründen muss ich einen ByteBuffer verwenden.SWIG typemap uint8_t * von C/C++ zu java.nio.ByteBuffer
Beide Puffer wurden im C++ Teil zugewiesen und ich muss sie an eine Java-Funktion übergeben, die den Eingabepuffer für einige Berechnungen verwendet und das Ergebnis in den Ausgabepuffer schreibt. Hier
ist ein vereinfachtes Beispiel dafür, wie die C++ wie folgt aussieht:
// 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";
}
Auf der Java-Seite, ich will dieses Ziel erreichen (JavaDelegate
Klasse wird von SWIG generiert):
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;
}
}
Das Problem ist, ich kann einfach nicht herausfinden, wie man die Typemaps macht, um ein einfaches char * in einen ByteBuffer zu schreiben, besonders in Verbindung mit der Director-Funktion von SWIG, die für die abstrakte Basisklasse aktiviert ist. Ich weiß, wie man einen ByteBuffer von Java zu C++ übergibt, aber ich kann nicht herausfinden, wie man das Gegenteil tut.
Jede Hilfe wird geschätzt!
ich eine DirectByteBuffer von Java nach C passieren würde ++ für sie, füllen Sie durch Änderung der Adresse und Kapazität, um die Daten zu kopieren zu vermeiden. –
Der Ausgabepuffer ist eigentlich ein Hardwarepuffer, also kann ich ihn nicht wirklich aus Java zuweisen. Natürlich könnte ich es später wieder in den Hardwarepuffer kopieren, aber ich würde es vorziehen, es einfach direkt nach Java zu mappen. – pokey909
http://stackoverflow.com/questions/15414753/shared-memory-between-c-and-java-processes –