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字符串的处理的主要内容,如果未能解决你的问题,请参考以下文章