JNI 函数(七)NIO 操作

JNI 函数(七)NIO 操作

  NIO 相关操作允许 Native 代码直接访问 java.nio 的直接缓冲区。直接缓冲区的内容可能存在于普通的垃圾回收器以外的本地内存。有关直接缓冲区的信息,可以参考 NIO 和 java.nio.ByteBuffer 类的规范。

  在 JDK/JRE 1.4 中引入了新的 JNI 函数,允许检查和操作做直接缓冲区

  1. NewDirectByteBuffer
  2. GetDirectBufferAddress
  3. GetDirectBufferCapacity

  每个 Java 虚拟机的实现都必须支持这些功能,但并不是每个实现都需要支持对直接缓冲区的 JNI 访问。如果 JVM 不支持这种访问,那么 NewDirectByteBuffer 和 GetDirectBufferAddress 函数必须始终返回 NULL,并且 GetDirectBufferCapacity 函数必须始终返回 -1。如果 JVM 确实支持这种访问,那么必须实现这三个函数才能返回合适的值。

(一) 返回ByteBuffer

函数原型:jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity);

  分配并返回一个直接的 java.nio.ByteBuffer 内存块从内存地址 address 开始的 capacity 个字节.

  调用这个函数并返回字节缓冲区的对象的 Native 代码必须保证缓冲区指向一个可靠的可被读写的内存区域。进入非法的内存位置有可能会返回任意数值,DNA 不会有明显的印象,也有可能抛出异常。

  参数:

    env:JNIEnv 接口指针

    address:内存区域的起始地址

    capacity:内存区域的大小

  返回:

    返回一个新开辟的 java.nio.ByteBuffer 对象的本地引用。如果产生异常,则返回 NULL。如果 JVM 不支持 JNI 访问直接缓冲区,也会返回 NULL

  异常:

    如果缓冲区分配失败,则返回 OutOfMemoryError

(二) 返回直接缓冲区中对象的初始地址

函数原型:void* GetDirectBufferAddress(JNIEnv *env, jobject buf);

  获取并返回 java.nio.Buffer 的内存初始地址

  该函数允许Native代码通过直接缓冲区对象访问Java代码的同一内存区域

  参数:

    env:JNIEnv 接口指针

    buf:java.nio.Buffer 对象

  返回:

    返回内存区域的初始地址。如果内存区域未定义,返回 NULL,如果给定的对象不是 java.nio.buffer,则返回 NULL,如果虚拟机不支持 JNI 访问,则返回 NULL。

(三) 返回直接缓冲区中对象的内存容量

函数原型:jlong GetDirectBufferCapacity(JNIEnv *env, jobject buf);

  获取并返回 java.nio.Buffer 的内存容量。该容量是内存区域可容纳的元素的个数

  参数:

    env:JNIEnv 接口指针

    buf:java.nio.Buffer 对象

  返回:

    返回内存区域的容量。如果指定的对象不是 java.nio.buffer,则返回 -1,或者如果对象是未对齐的 view buffer 且处理器架构不支持对齐访问。如果虚拟机不支持 JNI 访问则返回 -1。

原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/14136105.html