如何在本机中写入/读取直接 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
读取/写入并根据需要更新 position
和 limit
。
【讨论】:
彼得,感谢您的回复。所以我可以像 C 中的普通缓冲区(指针)一样使用 BUFF 吗? 是的,这就是直接 ByteBuffer 的意义所在,缓冲区是普通的原生“C”内存(ByteBuffer 是 Java 对象,但它的存储不是)。 ;) 好的,我明白了。谢谢你,彼得。以上是关于如何在本机中写入/读取直接 ByteBuffer?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 byte[] 转换为 bytebuffer 本机内存?