JNI之数组
Array Operations -- 数组操作
1.GetArrayLength
jsize GetArrayLength(JNIEnv *env, jarray array);
Returns the number of elements in the array.
返回数据的长度。
参数:
env:JNI 接口指针。
array
:Java 数组对象。
返回值:
数组的长度。
2.NewObjectArray
jobjectArray NewObjectArray(JNIEnv *env, jsize length,jclass elementClass, jobject initialElement);
Constructs a new array holding objects in class elementClass
. All elements are initially set to initialElement
.
构造新的数组,它将保存类 elementClass
中的对象。所有元素初始值均设为 initialElement
。
参数:
env:JNI 接口指针。
length
:数组大小。
elementClass
:数组元素类。
initialElement
:初始值。
返回值:
Java 数组对象。如果无法构造数组,则为 NULL
。
抛出:
OutOfMemoryError:如果系统内存不足。
3.GetObjectArrayElement
jobject GetObjectArrayElement(JNIEnv *env,jobjectArray array, jsize index);
Returns an element of an Object
array.
返回 Object
数组的元素。
参数:
env:JNI 接口指针。
array
:Java 数组。
index
:数组下标。
返回值:
Java 对象。
抛出:
ArrayIndexOutOfBoundsException:如果 index
不是数组中的有效下标。
4.SetObjectArrayElement
void SetObjectArrayElement(JNIEnv *env, jobjectArray array,jsize index, jobject value);
Sets an element of an Object
array.
设置 Object
数组的元素。
参数:
env:JNI 接口指针。
array
:Java 数组。
index
:数组下标。
value
:新值。
抛出:
ArrayIndexOutOfBoundsException:如果 index
不是数组中的有效下标。
ArrayStoreException
:如果 value
的类不是数组元素类的子类。
5.New<PrimitiveType>Array Routines
ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length);
A family of operations used to construct a new primitive array object. Table 4-8 describes the specific primitive array constructors. You should replace New<PrimitiveType>Array with one of the actual primitive array constructor routine names from the following table, and replace ArrayType with the corresponding array type for that routine.
用于构造新基本类型数组对象的一系列操作。表 4-8 说明了特定的基本类型数组构造函数。用户应把New<PrimitiveType>Array 替换为某个实际的基本类型数组构造函数例程名(见下表),然后将 ArrayType替换为该例程相应的数组类型。
参数:
env:JNI 接口指针。
length
:数组长度。
返回值:
Java 数组。如果无法构造该数组,则为 NULL
。
6.Get<PrimitiveType>ArrayElements Routines
NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env,ArrayType array, jboolean *isCopy);
A family of functions that returns the body of the primitive array. The result is valid until the corresponding Release<PrimitiveType>ArrayElements() function is called. Since the returned array may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until Release<PrimitiveType>ArrayElements() is called.
If isCopy is not NULL, then *isCopy is set to JNI_TRUE if a copy is made; or it is set to JNI_FALSE if no copy is made.
The following table describes the specific primitive array element accessors. You should make the following substitutions:
- Replace Get<PrimitiveType>ArrayElements with one of the actual primitive element accessor routine names from the table.
- Replace ArrayType with the corresponding array type.
- Replace NativeType with the corresponding native type for that routine.
Regardless of how boolean arrays are represented in the Java VM, GetBooleanArrayElements() always returns a pointer to jbooleans, with each byte denoting an element (the unpacked representation). All arrays of other types are guaranteed to be contiguous in memory.
一组返回基本类型数组体的函数。结果在调用相应的 Release<PrimitiveType>ArrayElements()函数前将一直有效。由于返回的数组可能是 Java 数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了Release<PrimitiveType>ArrayElements()。
如果 isCopy
不是 NULL
,*isCopy
在复制完成后即被设为 JNI_TRUE
。如果未复制,则设为 JNI_FALSE
。
下表说明了特定的基本类型数组元素访问器。应进行下列替换;
- 将 Get<PrimitiveType>ArrayElements 替换为表中某个实际的基本类型元素访问器例程名。
- 将 ArrayType 替换为对应的数组类型。
- 将 NativeType 替换为该例程对应的本地类型。
不管布尔数组在 Java 虚拟机中如何表示,GetBooleanArrayElements()
将始终返回一个 jbooleans
类型的指针,其中每一字节代表一个元素(开包表示)。内存中将确保所有其它类型的数组为连续的。
参数:
env:JNI 接口指针。
array
:Java 字符串对象。
isCopy
:指向布尔值的指针。
返回值:
返回指向数组元素的指针,如果操作失败,则为 NULL
。
JNI之数组的更多相关文章
- 008android初级篇之jni中数组的传递
008android初级篇之jni中数组的传递 jni中在native中数据类型的实际类型 jchar 占两个字节,跟native c中的char(占一个字节)是两个数据类型 jbyte, unsig ...
- JNI——访问数组
JNI在处理基本类型数组和对象数组上面是不同的.对象数组里面是一些指向对象实例或者其它数组的引用. 因为速度的原因,先通过GetXXXArrayElements函数把简单类型的数组转化成本地类型的数组 ...
- android JNI 一维数组、二维数组的访问与使用
在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...
- NDK(19)简单示例:ndk调用java基本方法、数组;使用stl、访问设备
一.ndk调用java类示例 1,调用基本方法 /* * Class: com_example_ndksample_MainActivity * Method: ndkFindJavaClass * ...
- Android JNI开发提高篇
有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...
- Android NDK开发之从Java与C互调中详解JNI使用(一)
生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
JNI/NDK Java调用C/C++前言 通过第三篇文章讲解在实际的开发过程中Java层调用C/C++层的处理流程.其实我们在很大的业务里也需要C/C+ +层去调用Java层,这两层之间的相互调用 ...
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- JNI由浅入深_6_简单对象的应用
1.声明native方法 public class ComplexObject { /** * 返回一个对象数组 * @param val * @return */ public native Per ...
随机推荐
- 如何解决DuplicateFileException: Duplicate files copied in APK问题
问题:有重复的文件存在APK里 解决方案:在Module里的build.gradle中设置忽略此重复文件即可.
- springboot部署多个vue项目
在springboot下部署多个vue项目,只需要将vue打包成静态文件后,将其放在resources的静态文件夹下即可. 如下图:static目录下有三个vue的静态文件夹,分别为运营后台(admi ...
- Xamarin+vs2010部署错误:error MSB6004: 指定的任务可执行文件位置\sdk\\tools\zipalign.exe”无效
好不容易配好了Xamarin和vs2010,也搞好了GenyMotion的虚拟机配置,开始调试的时候又报出了这样的错误: error MSB6004: 指定的任务可执行文件位置"C:\Use ...
- 【BZOJ2742】【HEOI2012】Akai的数学作业 [数论]
Akai的数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这里是广袤无垠的宇宙这里 ...
- 汕头市队赛 C KMP codeforces B. Image Preview
汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- 【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排
[算法]状压DP [题解]对于上一行的每个状态,每行进行DFS. #include<cstdio> #include<algorithm> #include<cstrin ...
- .NET中zip的压缩和解压
在.NET可以通过多种方式实现zip的压缩和解压:1.使用System.IO.Packaging:2.使用第三方类库:3.通过 System.IO.Compression 命名空间中新增的ZipArc ...
- 使用APICloud打包webapp
做个记录: 参照apicloud官方文档:http://docs.apicloud.com/Dev-Tools/sublime-apicloud-plugin 可以看下我的github:https:/ ...
- linux基础 -nginx和nfs代理 开发脚本自动部署及监控
开发脚本自动部署及监控 1.编写脚本自动部署反向代理.web.nfs: (1).部署nginx反向代理三个web服务,调度算法使用加权轮询: (2).所有web服务使用共享存储nfs,保证所有web ...