NDK开发之字符串操作
来源:互联网 发布:余弦相似度公式 python 编辑:程序博客网 时间:2024/06/11 19:48
在JNI中,Java字符串被当作一个引用来处理。这些引用类型并不像原生C字符串一样可以直接使用,JNI提供了Java字符串与C字符串之间转换的必要函数,因为Java字符串对象是不可变的(如果对这里有异议,请复习Java SE),因此JNI不提供任何修改现有的Java字符串内容的函数。
JNI支持两种编码格式的字符串,分别是Unicode和UTF-8。
好了,废话说完了,下面按部就班来。
一、创建字符串
我们可以在原生的C或者C++代码中使用NewString函数来构建Unicode编码格式的字符串,也可以使用NewStringUTF函数来构建UTF-8格式的字符串,如下,用一个给定的C字符串构建一个Java字符串。
jstring Java_com_example_jni_MainActivity_stringTest1(JNIEnv* env, jobject thiz) {//创建字符串,用给定的C字符串创建Java字符串 jstring javaString; javaString = (*env)->NewStringUTF(env, "hello world!,hello lenve");}
二、把Java字符串转换成C字符串
为了在原生代码中使用Java字符串,需要先将Java字符串转换成C字符串,使用GetStringChars函数可以将Unicode格式的Java字符串转换成C字符串,使用GetStringUTFChars函数可以将UTF-8格式的Java字符串转换成C字符串。这两个函数的第三个参数均为可选参数,该可选参数是isCopy,它让调用者确定返回的C字符串地址是指向副本还是指向堆中的固定对象。
jstring Java_com_example_jni_MainActivity_stringTest2(JNIEnv* env, jobject thiz, jstring javaString) {//把Java字符串转换为C字符串 const jbyte* str; jboolean isCopy; jstring javaStr; str = (*env)->GetStringUTFChars(env,javaString,&isCopy); if(0!=str){ printf("java String is :%s",str); if(JNI_TRUE==isCopy){ printf("C string is a copy of the java String."); javaStr = (*env)->NewStringUTF(env,"C string is a copy of the java String."); }else{ printf("C string points to actual String."); javaStr = (*env)->NewStringUTF(env,"C string points to actual String."); } } return javaStr;}
三、释放字符串
通过GetStringChars函数和GetStringUTFChars函数获得的C字符串在原生代码中使用完成后要正确的释放,否则会造成内存泄漏。和上面一样,释放函数也是有两个。ReleaseStringUTFChars和ReleaseStringChars,分别释放UTF-8格式和Unicode格式的字符串。
该函数有三个参数,第一个上篇博客已说过,不多说,第二个和第三个分别表示Java字符串和C字符串
本工程源码下载
- NDK开发之字符串操作
- Android NDk开发系列之字符串操作
- NDK开发之数组操作
- 驱动开发之字符串操作
- Android NDK开发之数组类型的操作
- android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- Android之NDK开发
- 因为将工程放在带有中文的文件夹下,打不开sln文件
- errno 两个相关的打印出错信息函数 strerror和perror
- 如何删除github里面的仓库(学习笔记)
- 第三方后台管理
- Linux TCP/IP通讯建立
- NDK开发之字符串操作
- HDU——2104 hide handkerchief
- 嵌入式linux之DMA驱动
- 多对多的关系操作
- 关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)
- 步骤条的实现原理及AliceUI中步骤条Step的应用
- 实施 ORM 的两项要旨:泛型和反射
- 18.策略模式
- RVO和NRVO