我们经常遇到在native代码中处理数组的需求,JNI中数组的使用可以说是基本功。下面的例子演示了如何在JNI中获取数组的长度,JNI获取Java层的数组并使用等。
返回数组中元素的数量。
LINKAGE:
JNIEnv接口函数表中的索引171。
PARAMETERS:
env:JNI接口指针。
array:一个Java数组对象。
RETURNS:
返回数组的长度。
用于构造新原始数组对象的一系列操作。下表描述了特定的基本数组构造函数。您应该将NewArray替换为此表中的一个实际原始数组构造函数例程名称,并将ArrayType替换为该例程的相应数组类型。
LINKAGE:
JNIEnv接口函数表中的索引。
PARAMETERS:
env:JNI接口指针。
length:数组长度。
RETURNS:
返回Java数组,如果无法构造数组,则返回NULL。
返回基本数组主体的一系列函数。结果有效,直到调用相应的ReleaseArrayElements()函数。由于返回的数组可能是Java数组的副本,因此在调用ReleaseArrayElements())之前,对返回数组所做的更改不一定会反映在原始数组中。
如果isCopy不为NULL,如果进行了复制,则*isCopy设置为JNI_TRUE; 如果没有复制,则设置为JNI_FALSE。
下表描述了特定的原始数组元素访问器。您应该进行以下替换:
- 将GetArrayElements替换为下表中的一个实际原始元素访问器例程名称。
- 将ArrayType替换为相应的数组类型。
- 将NativeType替换为该例程的相应本地类型。
无论如何在JVM中表示布尔数组,GetBooleanArrayElements()始终返回指向jbooleans的指针,每个字节表示一个元素(解包表示)。其他类型的所有数组都保证在内存中是连续的。
LINKAGE:
JNIEnv接口函数表中的索引。
PARAMETERS:
env:JNI接口指针。
array:一个Java字符串对象。
isCopy:指向布尔值的指针。
RETURNS:
返回指向数组元素的指针,如果操作失败则返回NULL。
一系列函数,通知VM本地代码不再需要访问elems。elems参数是使用相应的GetArrayElements()函数从数组派生的指针。如有必要,此函数会将对elems所做的所有更改复制回原始数组。
mode参数提供有关如何释放数组缓冲区的信息。如果elems不是数组中元素的副本,则mode无效。否则,模式会产生以下影响,如下表所示:
在大多数情况下,程序员将“0”传递给mode参数,以确保固定和复制数组的一致行为。其他选项使程序员可以更好地控制内存管理,并且应该非常谨慎地使用。
下表描述了构成原始数组处理者系列的特定例程。您应该进行以下替换:
- 将ReleaseArrayElements替换为下表中的一个实际原始数组处理程序例程名称。
- 将ArrayType替换为相应的数组类型。
- 将NativeType替换为该例程的相应本地类型。
LINKAGE:
JNIEnv接口函数表中的索引。
PARAMETERS:
env:JNI接口指针。
array:一个Java数组对象。
elems:指向数组元素的指针。
mode:释放模式。
一组函数,将原始数组的某个区域复制到缓冲区中。
下表描述了特定的原始数组元素访问器,你应该做以下替换:
- 将GetArrayRegion替换为下表中的一个实际原始元素访问器例程名称。
- 将ArrayType替换为相应的数组类型。
- 将NativeType替换为该例程的相应本地类型。
LINKAGE:
JNIEnv接口函数表中的索引。
PARAMETERS:
env:JNI接口指针。
array:一个Java数组。
start:起始索引。
len:要复制的元素数。
buf:目标缓冲区。
THROWS:
ArrayIndexOutOfBoundsException: 如果区域中的某个索引无效。
一组函数,用于从缓冲区中复制回原始数组的某个区域。
下表描述了特定的原始数组元素访问器。您应该进行以下替换:
将SetArrayRegion替换为下表中的一个实际原始元素访问器例程名称。
将ArrayType替换为相应的数组类型。
将NativeType替换为该例程的相应本地类型。
LINKAGE:
JNIEnv接口函数表中的索引。
PARAMETERS:
env:JNI接口指针。
array:一个Java数组。
start:起始索引。
len:要复制的元素数。
buf:源缓冲区。
THROWS:
ArrayIndexOutOfBoundsException: 如果区域中的某个索引无效。
注意:
从JDK/JRE 1.1开始,程序员可以使用Get/ReleaseArrayElements函数来获取指向原始数组元素的指针。如果VM支持固定,则返回指向原始数据的指针; 否则,制作副本。从JDK/JRE 1.3开始引入的新功能允许本地代码获取指向数组元素的直接指针,即使VM不支持固定。
本实例通过在native代码中修改传入的数组,观察不同的JNI函数的作用。我们不难发现GetIntArrayElements和ReleaseIntArrayElements要成对使用,如果乱用,会出现意想不到的问题。同时在ReleaseIntArrayElements函数中试验了参数JNI_ABORT,发现native修改并未生效。最后验证了GetIntArrayRegion、SetIntArrayRegion和NewIntArray。这些函数都是我们在JNI操作数组中经常遇到的。
Native代码:
运行结果
到此这篇ifstream获取文件长度(ifstream的getline)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/17232.html