【发布时间】:2017-05-09 04:07:18
【问题描述】:
我正在尝试将输入和输出缓冲区从 C++ 传递给 java 类。 出于效率原因,我需要使用 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。
-
感谢您的帮助,但这是为它创建一个 SWIG 类型图。例如。从Java到C++的路在github.com/swig/swig/blob/master/Lib/java/various.i已经搞定了,但是反过来就没了。