java - jbyte* 作为 JNI 中 native C++ 方法的 ByteBuffer

标签 java c++ macos java-native-interface bytebuffer

这是 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/

相关文章:

java - 在 Eclipse 中将外部 jar 添加为单独的文件或用户定义的库的首选方法?

Java正则表达式拆分保持收缩

objective-c - ParseKit 汇编程序回调未调用 : What am I doing wrong?

ios - 在本地两台计算机之间共享 git repo

c++ - 编译单个文件并与其他 .o 文件链接时是否可能出现核心转储?

cocoa - 如何使坞站重新加载所有坞站磁贴插件?

java - 双循环赛

java - 我的教授所说的 "Implementing a static Abstract Data Type"是什么意思?

c++ - OpenGL,如何旋转彼此独立的对象?

c++ - 如何仅使用 Linux 终端刷入 stm32?