前言:这不是 SWIG-ish 解决方案,这是通用目的,我发现this https://qinjin.wordpress.com/2011/10/11/mapping-between-char-and-byte-in-swig/与你的问题有些相关
首先,没有ref
据我所知,Java 中的参数因此直接从 C++ 传递它不是一个选项,除非您准备好更改签名并将其作为返回值。这可以通过从 Java 传递 typewrapper 并让 C++ 在其中创建/设置缓冲区来规避,例如:
public class BufferWrapper {
private ByteBuffer mBuffer;
public void setBuffer(ByteBuffer buffer) {
mBuffer = buffer;
}
}
只需将其传递给 C++ 并让它分配缓冲区并将其设置为包装器即可。
There's 新直接字节缓冲区 https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBufferJNI 函数完全满足您的需要:
分配并返回一个直接引用的 java.nio.ByteBuffer
从内存地址开始并扩展的内存块
容量字节。
调用此函数并返回结果的本机代码
字节缓冲区对象到Java级代码应该确保缓冲区
指的是可读取的有效内存区域,
如果合适的话,写作。尝试访问无效内存
Java 代码中的位置要么返回任意值,要么返回任意值
可见的效果,或导致抛出未指定的异常。
P.S 我们本可以采取其他方式 - ByteBuffer 已经wrap https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#wrap(byte%5B%5D)方法允许您包装现有的缓冲区byte[]
这不完全是char*
但我们可以嫁给他们(看看这个answer https://stackoverflow.com/questions/17124712/jni-android-converting-char-to-byte-array-and-return-it-to-java()).
深入了解 Jni 方法实现:
jsize n = sizeof(yourBuf);
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)yourBuf);
However请注意,根据doc https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html这个函数会产生copy不只是包装,所以我注定它在这里没有多大帮助