JNI之函数介绍四之数组操作

NDK  2023年7月25日 pm6:55发布1年前 (2023)更新 91es.com站长
51 0 0

前言

今天介绍一下JNI数组相关操作函数。

正文

GetArrayLength

# env: JNI 接口指针
# array: Java 数组对象
jsize GetArrayLength(JNIEnv *env, jarray array);

返回数组中的元素数(数组的长度)。

NewObjectArray

# env: JNI 接口指针
# length:数组大小
# elementClass:数组元素类
# initialElement:初始值
jarray NewObjectArray(JNIEnv *env, jsize length,jclass elementClass, jobject initialElement);

构造新的数组,保存类 elementClass 中的对象,所有元素初始值均设为initialElement 。

# 创建一个Person数组,每个元素为NULL
jobjectArray array = env->NewObjectArray(length, clazz_Person, NULL);

没怎么用过~_~

如果成功,返回数组对象,否则返回NULL。

GetObjectArrayElement

# env: JNI 接口指针
# array: Java 数组
# index:数组下标
jobject GetObjectArrayElement(JNIEnv *env,jobjectArray array, jsize index);

返回 Object 数组的元素。

如果 index 不是数组中的有效下标,抛出异常ArrayIndexOutOfBoundsException。

SetObjectArrayElement

# env: JNI 接口指针
# array: Java 数组
# index:数组下标
# value:新值
void SetObjectArrayElement(JNIEnv *env, jobjectArray array,jsize index, jobject value);

设置 Object 数组的元素。

如果 index 不是数组中的有效下标,抛出ArrayIndexOutOfBoundsException。

如果 value 的类不是数组元素类的子类,抛出ArrayStoreException。

New<PrimitiveType>Array

# env: JNI 接口指针
# length:数组长度
ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length);

创建对应<PrimitiveType>类型的数组。

NewBooleanArray()   jbooleanArray
NewByteArray()      jbyteArray
NewCharArray()      jcharArray
NewShortArray()     jshortArray
NewIntArray()       jintArray
NewLongArray()      jlongArray
NewFloatArray()     jfloatArray
NewDoubleArray()    jdoubleArray
NewIntArray

以int类型为例

jintArray NewIntArray(JNIEnv *env, jsize length);

Get<PrimitiveType>ArrayElements

# env: JNI 接口指针
# array: Java 字符串对象
# isCopy:指向布尔值的指针
NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env,ArrayType array, jboolean *isCopy);

一组返回基本类型数组体的函数。结果在调用相应的Release<PrimitiveType>ArrayElements() 函数前将一直有效。 由于返回的数组可能是 Java 数组的副本, 因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了 Release<PrimitiveType>ArrayElements()。

如果 isCopy 不是 NULL, *isCopy 在复制完成后即被设为 JNI_TRUE。 如果未复制,则设为 JNI_FALSE。

注意事项:

  1. Get<PrimitiveType>ArrayElements 替换为表中某个实际的基本类型 元素访问器例程名

  2. 将 ArrayType 替换为对应的数组类型。

  3. 将 NativeType 替换为该例程对应的本地类型。

GetIntArrayElements

以int类为例

jint * GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy);

Release<PrimitiveType>ArrayElements

# env: JNI 接口指针
# array: Java 数组对象
# elems:指向数组元素的指针
# mode:释放模式
void Release<PrimitiveType>ArrayElements(JNIEnv *env,ArrayType array, NativeType *elems, jint mode);

通知虚拟机平台相关代码无需再访问 elems 的一组函数。 elems 参数是一个通过使用对应的 Get<PrimitiveType>ArrayElements() 函数由 array 导出的指针。必要时,该函数将把对 elems 的修改复制回基本类型数组。

mode 参数将提供有关如何释放数组缓冲区的信息。如果 elems 不是 array 中数组元素的副本, mode 将无效。否则, mode 将具有下表所述的功能:

  1. 0 复制回内容并释放 elems 缓冲区

  2. JNI_COMMIT 复制回内容但不释放 elems 缓冲区

  3. JNI_ABORT 释放缓冲区但不复制回变化

多数情况下,编程人员将把“ 0” 传给 mode 参数以确保固定的数组和复制的数组保持一致。 其它选项可以使编程人员进一步控制内存管理, 但使用时务必慎重。

ReleaseIntArrayElements

以int类为例

void ReleaseIntArrayElements(JNIEnv *env,jintArray array, jint *elems, jint mode);

Set<PrimitiveType>ArrayRegion

# env: JNI 接口指针
# array: Java 数组
# start:起始下标
# len:要复制的元素数
# buf:源缓冲区
void Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, NativeType *buf);

将基本类型数组的某一区域从缓冲区中复制回来的一组函数。

如果区域中的某个下标无效,就抛出ArrayIndexOutOfBoundsException

Get<PrimitiveType>ArrayRegion

# env: JNI 接口指针
# array: Java 指针
# start:起始下标
# len:要复制的元素数
# buf:目的缓冲区
void Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, NativeType *buf);

将基本类型数组某一区域复制到缓冲区中的一组函数。

如果区域中的某个下标无效,抛出ArrayIndexOutOfBoundsException。

参考文章

  1. JNI完全手册]》

  2. NDK中jni.h头文件完整内容

  3. JNI引用类型数组操作

 历史上的今天

  1. 2022: Android进程间通信方式Messenger的简单记录(0条评论)
  2. 2021: 余光中:绝色(0条评论)
  3. 2019: 龙应台:中国人,你为什么不生气?(0条评论)
  4. 2018: Launcher2之拖拽事件(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

塔斯格丝:给希望留点空间

西西里监狱是一级监狱,虽然坐落在城市的中央,但却感受不到丝毫的繁华与自由。卡洛奇自杀过很多次,可惜,狱警连他自杀的权利都给剥夺了。卡洛奇已经在这个小房间待了整整三年,只有每周放风时能看看“外面的世界”。越狱是绝对不可能,他唯一想做的就是下地狱,因为西西里监狱比地狱更折磨人。唯一的方式便是挑衅奥多...

Link of class 'Lcom.....;' failed

问题描述导入同事修改的系统应用后编译成功,但运行起来后就异常了。Link of class 'Lcom/.....;' failed异常完整日志W/dalvikvm( 5955): Link of class 'Lcom/la/music/PlayFragment;' failedW/...

Android的AssetManager使用

前言Android有assets和resources两大资源系统。resources资源系统设计有良好的检索系机制,但它无法应付图形和声音文件这样的大文件,因此这些资源实际是保存在assets系统里的。/res和/assets的不同点是,Android不为/assets下的文件生成ID。如果使...

西贝:路人

不知为何,明明想和你说话。却骗你说,风雨正好,该去写点诗句。 不必嘲讽我,你笑出声来,我也当是天籁。 不必怀有敌意,你所有心计,我都当是你对我的心意。 我的宿命分两段,未遇见你时,和遇见你以后。你治好我的忧郁,而后赐我悲伤。 忧郁和悲...

Windows 文本大文件查看工具glogg

前言工作中,测试部偶尔要煲机测试,然后会提供一大堆巨大的日志。工作中比较常用的是notepad++(个人偏爱),经常打开大份日志时就卡顿,如果要整体搜索那就更快,偶尔甚至直接崩溃。同事有推荐pycharm看,但我不太喜欢,最后遇到glogg,看打日志就好多了。正文对于打日志,还有一种方式就...

铁凝:幸福就在此刻

去探望一位生病的友人,聊起很多从前的事情,计划很多未来的事情,她忽然发问:对于你来说,幸福的时刻是什么?想了半天,竟然没有一个很适合的答案。那阵子,经常携带这个难题去和人打交道,不管是新朋还是故友,聊到酣畅总是抛出这个问题冷场,当然,收获的答案也是五花八门——有人说,幸福的时刻就是加官晋爵时买房...