JNI 函数(七)NIO 操作
NIO 相关操作允许 Native 代码直接访问 java.nio 的直接缓冲区。直接缓冲区的内容可能存在于普通的垃圾回收器以外的本地内存。有关直接缓冲区的信息,可以参考 NIO 和 java.nio.ByteBuffer 类的规范。
在 JDK/JRE 1.4 中引入了新的 JNI 函数,允许检查和操作做直接缓冲区
- NewDirectByteBuffer
- GetDirectBufferAddress
- 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。