• 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。

  • 相关阅读:
    在eclipse中使用maven构建spring cloud微服务
    SpringBoot中VO,DTO,DO,PO的概念、区别和用处
    报错Connection refused: connect
    @RequestBody的使用
    Chrome插件Postman的数据目录存储位置,记一次重装系统后找回postman数据的过程...
    SpringBoot中VO,DTO,DO,PO的概念、区别和用处
    Oracle中的instr()函数 详解及应用
    for循环里的break,continue和return有什么差别
    BigDecimal转String
    字符串转为日期,日期转为字符串
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/14136105.html
Copyright © 2020-2023  润新知