Java非托管内存流

时间:2012-01-04 15:58:16

标签: java java-native-interface

我正在尝试设计一个API,以允许我的Java应用程序与专有的进程间消息传递环境进行交互。消息预先存在于非托管内存中。收到消息后,我想要一个流来读取和写入消息。虽然我理解JNI的基础知识,但我很难理解哪些标准Java类可以帮助创建非托管内存的流。

我会感激任何指针

此致

2 个答案:

答案 0 :(得分:4)

我会使用直接的ByteBuffer。您可以通过JNI更改地址和限制。一旦这样,您可以读取或更改此ByteBuffer中的任何内容,它将在“非托管”大小上更改。

ByteBuffer支持little和big endian以及所有原始类型的读写。


这样做的一个原始方法是使用Unsafe类。它支持在内存的随机区域(就像指针一样)访问原语。在许多情况下,它还简化为单个机器代码指令。不安全不安全或不便携,如果你可以使用ByteBuffer,它是一个更好的选择。

答案 1 :(得分:2)

JNI API有一个名为NewDirectByteBuffer的方法,声明为:

jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);

它的作用是占用一个记忆区域,由void*描述指向它的顶部和一个长度,并创建一个ByteBuffer包裹它。这不是副本;对缓冲区的更改将改变内存区域中的数据。

ByteBuffer有一个非常丰富的API。没有标准的方法可以创建一个从其中读取的InputStream或一个写入一个的OutputStream,但这样的东西很容易编写。

相关问题