如何在本机中写入/读取直接 ByteBuffer?

Posted

技术标签:

【中文标题】如何在本机中写入/读取直接 ByteBuffer?【英文标题】:How to write/read the direct ByteBuffer in the native? 【发布时间】:2011-06-24 15:43:47 【问题描述】:

我想在本机部分从套接字接收数据,然后在 Java 代码中读取数据。 我知道直接的 ByteBuffer 可能是一个不错的选择。所以我在 Java 中准备了一个 ByteBuffer 之类的东西

ByteBuffer myBuffer = ByteBuffer.allocateDirect(128); 

我通过以下代码在本机中得到这个 ByteBuffer

JNIEXPORT jboolean JNICALL Java_nfore_android_bt_pro_nfhfp_rcvSco(JNIEnv *env, jobject this, jint fd, jobject buff)

int buff_size;
int socketfd;

jbyte *BUFF = (*env)->GetDirectBufferAddress(env, buff); 
buff_size = (*env)->GetDirectBufferCapacity(env, buff);

socketfd = fd; .....

现在,我的愚蠢问题是

(1) 仅从语句中获取 int 类型变量 socketfd 是否正确 “socketfd = fd”??? (fd是jint类型,在Linux中确实是socket fd) (2) 我如何在 C 中将数据写入这个 ByteBuffer ???

确实,... 我的情况是我在另一个本地 C++ 函数中获得了一个 Linux 套接字 fd,但是,我无法在其中添加我想要的函数。我想用这个 fd 来读/写数据,但我知道在 Java 代码中这是不可能的。所以我决定将它传递给 native 并使用直接的 ByteBuffer 来存储临时数据。

有什么建议吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以在 Java 中对 FileDescriptors 进行读写操作。

但是,要读取/写入直接缓冲区,您只需从 BUFF 读取/写入并根据需要更新 positionlimit

【讨论】:

彼得,感谢您的回复。所以我可以像 C 中的普通缓冲区(指针)一样使用 BUFF 吗? 是的,这就是直接 ByteBuffer 的意义所在,缓冲区是普通的原生“C”内存(ByteBuffer 是 Java 对象,但它的存储不是)。 ;) 好的,我明白了。谢谢你,彼得。

以上是关于如何在本机中写入/读取直接 ByteBuffer?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 byte[] 转换为 bytebuffer 本机内存?

ByteBuffer

支持小端写入/读取的可扩展 ByteBuffer 等效项?

从 ByteBuffer 获取到 byte[] 不写入到 byte[]

[nio] 1 - ByteBuffer

Netty——ByteBuffer的方法说明演示示例