在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. 使用 .NET 平台,如何玩转 Universal Windows 应用?

    2015年7月30日 本文作者是 Managed Languages 团队项目经理 Lucian Wischik. 不久前,Visual Studio 2015上新增 Windows 10 应用的开发 ...

  2. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  3. ANDROID_MARS学习笔记_S03_004_getAllProviders、LOCATIONLISTENER、getBestProvider

    一.代码 1.xml(1)activity_main.xml <uses-permission android:name="android.permission.ACCESS_FINE ...

  4. statspack系列6

    原文:http://jonathanlewis.wordpress.com/2006/12/27/analysing-statspack-6/ 作者:Jonathan Lewis 下面是一段时间以前网 ...

  5. POJ_2385_Apple_Catching_(动态规划)

    描述 http://poj.org/problem?id=2385 两棵苹果树,给定一个时间t,1~t每分钟有一棵树掉苹果,牛起始在#1树,最多换w次位置,问最多接到多少苹果. Apple Catch ...

  6. jboss项目迁移至WebLogic12

    1 weblogic 使用jtds-1.2.3.jar驱动链接MS SQL Server 2008的数据源配置 1.1 拷贝jtds-1.2.3.jar至D:\Oracle\Middleware\wl ...

  7. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  8. “面包屑导航”——SiteMapPath控件的使用(ASP.NET)(转)

    转自:http://www.cnblogs.com/ball-head/archive/2010/09/28/1837253.html 最近在博客里写了一些日志,主要都是我在实际编程过程中遇到的问题. ...

  9. Cocos2d-x学习之windows 7的visual studo 2010开发环境安装

    1.引擎代码的下载 官方版本地址为: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download 目前最新版本是cocos2d-2.0-rc0a ...

  10. 关于.NET三层 分类: C#

    三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规则 各层的作用 1:数据数据访问层:主要是对原始数据(数据库或者 ...