zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    什么是接口测试?
    接口测试浅谈
    软件测试之数据库面试题
    软件测试的流程是什么?
    多用户博客网站开发实战之创建数据库
    利用python脚本统计和删除redis key
    ULR1 B. 【ULR #1】光伏元件
    法拉第未来任命新CFO!贾跃亭激动发声
    人民需要特斯拉,但条件不允许
    什么叫IOCSABS呢
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/14136105.html
Copyright © 2011-2022 走看看