在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开发之字符串操作的更多相关文章

  1. nginx开发_字符串操作函数

    由于ngx_str_t为非NULL结尾的函数,且网络请求中有大量忽略大小写的需求,所以nginx内部封装了许多字符串操作相关的函数,函数名称极其相识,且使用时有有些约定,特此整理. 赋值&拷贝 ...

  2. 【C/C++开发】字符串操作

    1)字符串操作 strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat(p, p1) 附加字符串  strncat(p, p1, n) 附加指 ...

  3. NDK开发之数组操作

    JNI把Java数组当作引用类型来处理,JNI提供了必要的函数来访问和处理Java数组. 下面一个一个来看. 1.创建数组 我们可以使用NewArray函数在原生代码中创建数组实例,其中可以是Int. ...

  4. JNI/NDK开发指南(四)——字符串处理

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/42066665 从第三章中能够看出JNI中的基本类型和Java中的基本类型都是一一相应的,接 ...

  5. Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...

  6. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  7. 《Windows内核安全与驱动开发》 3.1 字符串操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.1 字符串操作 一.字符串的初始化 1. 判断下列代码为什么会蓝屏? U ...

  8. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  9. PHP开发中常用的字符串操作函数

    1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...

随机推荐

  1. 一篇文章让你读懂 OpenStack 的起源、架构和应用

    OpenStack 是一个面向 IaaS 层的开源项目,用于实现公有云和私有云的部署及管理.拥有众多大公司的行业背书和数以千计的社区成员, OpenStack 被看作是云计算的未来.目前 OS 基金会 ...

  2. Android 使用XmlPullParser解析xml

    这里我们假设要解析的xml文件名为:test.xml,我们将其放在assets路径中. xml文件内容为: <?xml version='1.0' encoding='utf-8' standa ...

  3. [wikioi]最优布线问题

    http://wikioi.com/problem/1231/ Kruskal+并查集.comp函数里面如果用const引用的话,可以减少copy.并查集find的时候是递归找父亲的根.无他. #in ...

  4. OA学习笔记-009-岗位管理的CRUD

    一.分析 Action->Service->Dao CRUD有功能已经抽取到BaseDaoImpl中实现,所以RoleDaoImpl没有CRUD的代码,直接从BaseDaoImpl中继承 ...

  5. Android用户界面 UI组件--TextView及其子类(三) EditView以及各种Span文字样式讲解

    EditView和TextView的用法差不多,只是文字可编辑 小技巧: 设置EditText隐藏键盘  setInputType(0); 设置EditText不被输入法遮盖  getWindow() ...

  6. 【踩坑记】从HybridApp到ReactNative

    前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...

  7. 改善C#程序的50种方法

    为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果.对于C ...

  8. mongodb windows下服务安装与卸载

    安装服务.bat  内容: d:\mongodb2.4.3\bin\mongod.exe --dbpath d:\data\db --config d:\mongodb2.4.3\mongod.cfg ...

  9. 【转】Android中设置TextView的颜色setTextColor--代码中设置字体颜色

    原文网址:http://www.cnblogs.com/myphoebe/archive/2012/01/06/2314728.html android中设置TextView的颜色有方法setText ...

  10. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法

    设计了一个数据库,某一个列名字是key,这与mysql数据库关键字冲突了,Hibernate下save总是报错. 在mysql命令中,解决办法很简单,只需要将关键字key用引号括起来就好了. 在Hib ...