Java非托管内存流

Java非托管内存流,java,java-native-interface,Java,Java Native Interface,我正在尝试设计一个API,以允许我的Java应用程序与专有的进程间消息传递环境进行接口。这些消息预先存在于非托管内存中。一旦我收到一条消息,我希望有一个流来读写消息。虽然我了解JNI的基础知识,但我仍在努力理解哪些标准Java类可以帮助创建到非托管内存的流 如果有任何建议,我将不胜感激 关于我会使用直接的ByteBuffer。您可以通过JNI更改地址和限制。一旦这是你可以读取或更改任何在这个ByteBuffer,它将改变“非托管”的大小 ByteBuffer支持所有基元类型的小端和大端以及读写

我正在尝试设计一个API,以允许我的Java应用程序与专有的进程间消息传递环境进行接口。这些消息预先存在于非托管内存中。一旦我收到一条消息,我希望有一个流来读写消息。虽然我了解JNI的基础知识,但我仍在努力理解哪些标准Java类可以帮助创建到非托管内存的流

如果有任何建议,我将不胜感激


关于

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

ByteBuffer支持所有基元类型的小端和大端以及读写



执行此操作的原始方法是使用不安全类。它支持在随机的内存区域(就像指针一样)访问原语,在许多情况下,它还简化为一条机器代码指令。“不安全”既不安全也不便于携带,如果您可以使用ByteBuffer,它是一个更好的选择。

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

ByteBuffer支持所有基元类型的小端和大端以及读写



执行此操作的原始方法是使用不安全类。它支持在随机的内存区域(就像指针一样)访问原语,在许多情况下,它还简化为一条机器代码指令。不安全不是安全的或可移植的,如果您可以使用ByteBuffer,它是一个更好的选择。

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

jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
它所做的是获取一个内存区域,由指向其顶部的
void*
和一个长度来描述,并创建一个包装。这不是副本;对缓冲区的更改将更改内存区域中的数据


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

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

jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
它所做的是获取一个内存区域,由指向其顶部的
void*
和一个长度来描述,并创建一个包装。这不是副本;对缓冲区的更改将更改内存区域中的数据


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

指针。。。你明白了吗…指针。。。你明白了吗……这听起来很积极,你有没有一个我可以参考的例子?没有,但我以前就这样用过。您覆盖的地址确实会导致内存泄漏,因为ByteBuffer有一个更干净的对象,该对象的原始地址是GCed,并随ByteBuffer一起释放。您是否建议在Java中创建ByteBuffer,然后在C中更改地址?您是否遇到过
NewDirectByteBuffer
JNI调用?如果您可以轻松重用ByteBuffer,您可以这样做。在Java中创建它使重用(从而避免创建垃圾)变得非常简单。这听起来是积极的,你有我可以参考的使用它的例子吗?没有,但我以前就这样使用过。您覆盖的地址确实会导致内存泄漏,因为ByteBuffer有一个更干净的对象,该对象的原始地址是GCed,并随ByteBuffer一起释放。您是否建议在Java中创建ByteBuffer,然后在C中更改地址?您是否遇到过
NewDirectByteBuffer
JNI调用?如果您可以轻松重用ByteBuffer,您可以这样做。用Java创建它使得重用(从而避免创建垃圾)非常简单。