Android NDK学习笔记6-JNI对引用数据类型的操作
来源:互联网 发布:txt转换mobi的软件 编辑:程序博客网 时间:2024/04/29 17:40
字符串操作
JNI把Java字符串当成引用类型来处理,JNI提供了java字符串与C字符串之间相互转换的必要函数。因为java字符串对象是不可变的,因此JNI不提供任何修改现有的java字符串内容的函数。
● 创建字符串
可以在原生代码中用NewString函数构建Unicode编码格式的字符串实例,用NewStringUTF函数构建UTF-8编码格式的字符串实例。
例如:下面的函数以一个C字符串为参数,并返回一个Java字符串引用类型jstring值。
jstring javastringjavastring = (*env)->NewStringUTF(env, "I LOVE YOU UU!");
注意,在内存溢出的情况下,NewString函数将返回NULL以通知原生代码虚拟机中有异常抛出。
● 把java字符串转换成C字符串
为了在原生代码中使用java字符串,需要先将java字符串转换成C字符串,我们使用GetStringChars函数可以将Unicode格式的java字符串转换成C字符串,使用GetStringUTFChars函数可以将UTF-8格式的Java字符串转换成C字符串。这些函数的第三个参数均为可选参数,该可选参数名是isCopy,它让调用者确定返回的C字符串地址指向副本还是指向堆中的固定对象。例如:
const jbyte* str;jboolean isCopy;str = (*env)->GetStringUTFChars(env, javaString,&isCopy);if(0 != str){ printf("java String: %s",str); if(JNI_TRUE == isCopy){ printf("C String is a copy of the java String"); }else{ printf("C String points to actual String"); }}
● 释放字符串
通过JNI GetStringChars 函数GetStringUTFChars函数获得的C字符串在原生代码中使用完成之后需要正确的释放,否则将会引起内存泄漏。通常我们使用ReleaseStringChars函数释放Unicode格式的字符串,使用ReleaseUTFStringChars函数释放UTF-8格式的字符串.
(*env)->ReleaseUTFStringChars(env,javaString,str);
数组操作
JNI把java数组当成引用类型来处理,JNI提供必要的函数访问和处理Java数组。
● 创建数组
用NewArray函数在原生代码中创建数组实例,其中可以是Int、Char和Boolean等。例如:
jintArray javaArray;javaArray = (*env)->NewIntArray(env,10);if(0 != javaArray){/*数组使用……*/}
注意,在内存溢出的情况下,NewArray函数将返回NULL以通知原生代码虚拟机中有异常抛出。
● 访问数组元素
JNI提供两种访问java数组元素的方法,可以将数组的代码赋值成C数组或者让JNI提供直接执行数组元素的指针。
● 对副本的操作
GetArrayRegion函数将给定的基本Java数组赋值到给对你给的C数组中,例如:
jint nativeArray[10];(*evn)->GetIntArrayRegion(env,javaArray,0,10,nativeArray);
原生代码可以像使用普通的C数组一样使用和修改数组元素。当原生代码想将所做的修改提交给java数组时,可以使用SetArrayRegion函数将C数组复制回java数组中。例如:
(*env)->SetIntArrayRegion(env,javaArray,0,10,nativeArray);
注意:当数组很大时,对数组做复制操作会引起性能问题。
● 对直接指针的操作
原生代码可以使用GetArrayElements函数获取执行数组元素的直接指针。例如:
jint nativeDirectArray;jboolean isCopy;nativeDirectArray = (*env)->GetIntArrayElements(env,javaArray,&isCopy);
其中,第三个&isCopy参数为可选参数,让调用者确定返回的C字符串地址指向副本还是指向堆中的固定对象。
因为可以像普通的C数组一样访问和处理数组元素,因此JNI没提供访问和处理数组元素的方法,JNI要求原生代码用完这些指针后立刻释放,否则会出现内存溢出。可以使用JNI提供的ReleaseArrayElements函数释放GetArrayElements返回的C数组。例如:
(*env)->ReleaseIntArrayRegion(env,javaArray,nativeDirectArray,0);
其中第四个参数是释放模式。
释放模式动作0将内容复制回来并释放原生数组JNI_COMMIT将内容复制回来但是不释放原生数组,一般用于周期性的更新一个java数组JNI_ABORT释放原生数组但不用将内容复制回来
- Android NDK学习笔记6-JNI对引用数据类型的操作
- JNI对引用数据类型的操作
- Android NDK学习笔记7-JNI的NIO操作
- Android JNI和NDK学习(06)--JNI的数据类型
- Android NDK学习笔记5-JNI数据类型总结
- Android studio NDK笔记2-JNI的数据类型
- Android NDK学习笔记13-JNI的局部和全局引用
- NDK学习笔记:jni数据类型转换
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- android(NDK+JNI)---JNI数据类型
- Android NDK开发之Jni的数据类型
- 对引用数据类型的操作
- Android NDK学习笔记8-JNI的访问域
- 使用html5 canvas绘制简单图形小作品~灰太狼
- Java中堆内存和栈内存详解
- python中读取文件函数read()、readline()、readlines()的区别
- C++ —— C++高手之路
- Andorid Studio快捷键
- Android NDK学习笔记6-JNI对引用数据类型的操作
- Python代理脚本获取Json数据
- Retrofit使用
- Java中构造器间的调用
- hdu5893 List wants to travel
- 生产环境的开源容器管理平台--Rancher入门教程(2): Host
- HDU4007 Dave 暴力 TWT Tokyo Olympic 2combo-1
- Delphi中Format的字符串格式化使用说明
- 【配置开发者】微信公众平台,配置开发者模式