这是 native C++ 方法。
JNIEXPORT jboolean JNICALL Java_xpnp_XpNamedPipe_readBytes
(JNIEnv* pEnv, jclass cls, jlong pipeHandle, jbyteArray readBufferJava, jint bytestoread, jint timeoutMsecs){
jbyte* readBuffer = NULL;
try {
readBuffer = pEnv->GetByteArrayElements(readBufferJava, NULL);
if (readBuffer == NULL) {
throw std::bad_alloc();
}
int retval = XPNP_readBytes ((XPNP_PipeHandle)pipeHandle, (char*)readBuffer, bytestoread, timeoutMsecs);
std::cout<<"this is what I read: " << readBuffer << "\n";
std::flush(std::cout);
return (retval <= 0) ? 0 : retval;
}catch (std::exception& except) {
// setErrorInfo(except.what());
}
return 0;
}
此方法打印它从调用 XPNP_readBytes
中读取的 readBuffer
的正确文本,但将全零数组传递给 Java!知道为什么会这样吗?我在传递指针或将其转换为 Java 时做错了什么吗?
这里是Java文件中原生C++方法的声明。
private static native boolean readBytes(long pipeHandle, byte[] buffer, int bytesToRead, int timeoutMsecs);
这是我调用 native 方法的地方。
boolean b = readBytes(namedPipeHandle, buffer, bytesToRead, timeoutMsecs);
String a = new String(buffer);
我在调用后读取的 buffer
全部为 0,即使它在 native 代码中打印了正确的文本!
最佳答案
查找 ReleaseByteArrayElements
。
关于java - jbyte* 作为 JNI 中 native C++ 方法的 ByteBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478613/