NDK开发之字符串操作
在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字符串
版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?