💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
图3.3展示了开发者应当如何在基础类型数组相关的JNI函数中进行选择。 ![](https://box.kancloud.cn/2016-02-24_56cdbc7bb89a0.png) 图3-3 如何在基础类型数组函数之间选择 如果你需要将数组内容拷贝到一个预先分配内存的C缓冲区中,或者要从C缓冲区中读取数组内容,请使用Get/Set<Type>ArrayRegion系列函数。 这些函数会进行边界检查,在必要的时候还会抛出ArrayIndexOutOfBoundsException异常。3.3.1节的原生代码示例就使用GetIntArrayRegion从一个jarray引用中复制出了10个元素。 对于小的,固定长度的数组,通常推荐使用Get/Set<Type>ArrayRegion函数,因为在使用的时候我们可以在C堆栈上开辟数组内容,这样做的代码通常会小很多。拷贝少量的数组元素的代价通常是可以忽略不计的(非常小)。 同时,Get/Set<Type>ArrayRegion函数允许你指定需要操作的起始索引以及要操作的元素数目,因此,如果原生代码需要访问一个比较大的数组的部分子元素的话,我们推荐使用这组函数。 如果你没有事先分配好内存的C混冲去,基础类型数组的大小是未知的且在持有指向数组内容指针的过程中原生代码不会被阻塞,在Java 2 SDK release1.2中我们推荐使用Get/ReleasePrimitiveArrayCritical函数,。就像Get/ReleaseStringCritical函数那样, 在使用Get/ReleasePrimitiveArrayCritical函数的时候你需要格外的小心,因为你的操作有可能导致死锁。 使用Get/Release<Type>ArrayElements系列函数通常是安全的。虚拟机通常会返回指向数组元素的指针或者返回一个指向复制了原始数组元素的缓冲区的指针。