JNI操作数组
- 1. jType* GetArrayElements(Array array, jboolean* isCopy)
- 2. void ReleaseArrayElements(jTypeArray array, j* elems, jint mode)
- 3. void GetArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, Type *buf)
- 4. void SetArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, const Type *buf)
1. jType* GetArrayElements(Array array, jboolean* isCopy)
1.1. isCopy
- true:数据会拷贝一份,返回的数据的指针是副本的指针
- false:不使用,可以设置为 0, NULL
2. void ReleaseArrayElements(jTypeArray array, j* elems, jint mode)
释放操作,只要有调用GetArrayElements方法,就必须要调用一次对应的ReleaseArrayElements方法,因为这样会删除掉可能会阻止垃圾回收的JNI本地引用
2.1. mode
GetArrayElements中的isCopy为true,我们才需要设置mode,为false我们mode可以不用处理,赋值0
- 0:更新Java堆上的数据并释放副本使用所占有的空间。
- JNI_COMMIT:提交,更新Java堆上的数据,不释放副本使用的空间。
- JNI_ABORT:撤销,不更新Java堆上的数据,释放副本使用所占有的空间。
3. void GetArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, Type *buf)
和GetStringRegion的作用是相似的,事先在C/C++中创建一个缓存区,然后将Java中的原始数组拷贝到缓冲区中去。
4. void SetArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, const Type *buf)
上面方法的对应方法,将缓冲区的部分数据设置回Java原始数组中。