Android JNI开发五: JNI字符串的处理

Posted 长沙火山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JNI开发五: JNI字符串的处理相关的知识,希望对你有一定的参考价值。

JNI 字符串处理

1. NewStringUTF 创建字符串
jstring NewStringUTF(const char *utf) {
   return functions->NewStringUTF(this,utf);
}

参数说明:
  -utf: 字符串
  
说明:
	通过调用NewStringUTF函数,会构建一个新的java.lang.String字符串对象。这个新创建的字符串会自动转换成Java支
	持的Unicode编码。如果JVM不能为构造java.lang.String分配足够的内存,NewStringUTF会抛出一个
	OutOfMemoryError异常,并返回NULL。在这个例子中我们不必检查它的返回值,如果NewStringUTF创建
	java.lang.String失败,OutOfMemoryError这个异常会被在Sample.main方法中抛出。如果NewStringUTF创建
	java.lang.String成功,则返回一个JNI引用,这个引用指向新创建的java.lang.String对象。
2. GetStringUTFChars
作用:获取字符串UTF的字符,返回由UTF-8修改的托管的字符串对象。
  
const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
		return functions->GetStringUTFChars(this,str,isCopy);
}

参数说明:
  -str:jstring类型(Java传递给本地代码的字符串指针)
	-isCopy:取值JNI_TRUE和JNI_FALSE
	如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表	 示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符	串不能修改的规定。这个值不能填NULL,否则会引起程序崩溃,可以填JNI_FALSE或者0。
 
说明:
  因为Java默认使用Unicode编码,而C/C++默认使用UTF编码,所以在本地代码中操作字符串的时候,必须使用合适的JNI函   	 数把jstring转换成C风格的字符串。JNI支持字符串在Unicode和UTF-8两种编码之间转换,GetStringUTFChars可以把一 	个jstring指针(指向JVM内部的Unicode字符序列)转换成一个UTF-8格式的C字符串。
3. ReleaseStringUTFChars 释放字符串
void ReleaseStringUTFChars(jstring str, const char* chars) {
    functions->ReleaseStringUTFChars(this,str,chars);
}

参数说明:
  -str: jstring类型(Java传递给本地代码的字符串指针)
	-chars: 调用GetStringUTFChars方法生成的字符串

说明:
	在调用GetStringUTFChars函数从JVM内部获取一个字符串之后,JVM内部会分配一块新的内存,用于存储源字符串的拷	   
  贝,以便本地代码访问和修改。即然有内存分配,用完之后马上释放是一个编程的好习惯。通过调用
  ReleaseStringUTFChars函数通知JVM这块内存已经不使用了,你可以清除了。
    
注意:
  这两个函数是配对使用的,用GetXXX就必须调用ReleaseXXX,而且这两个函数的命名也有规律,除了前面的Get和Release之外,后面的都一样。

以上是关于Android JNI开发五: JNI字符串的处理的主要内容,如果未能解决你的问题,请参考以下文章

Android jni/ndk编程五:jni异常处理

[RK3568][Android11]JNI调用流程分析

[RK3568][Android11]JNI调用流程分析

JNI/NDK开发指南——字符串处理

JNI/NDK开发指南——字符串处理

android中使用jni对字符串加解密实现分析