Android NDK(JNI)详解教程五 字符串操作

2023-03-02  本文已影响0人  Kael_Zhang的安卓笔记

JNI 字符串

jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);
jstring NewStringUTF(JNIEnv *env, const char *bytes);

这个新创建的字符串会自动转换成Java支持的Unicode编码。如果JVM不能为构造java.lang.String分配足够的内存,NewStringUTF会抛出一个OutOfMemoryError异常,并返回NULL

jsize GetStringLength(JNIEnv *env, jstring string);
jsize GetStringUTFLength(JNIEnv *env, jstring string);
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);
const char* GetStringUTFChars(jstring string, jboolean* isCopy)

isCopy:取值JNI_TRUE和JNI_FALSE,如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符串不能修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填nullptr即可

const char* s = env->GetStringUTFChars(sFromJava, nullptr);

不管有没有复制一份,使用完了都需要 release。(从 java 中 get 到的类和对象都需要 release)

void GetStringRegion(JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);

GetStringUTFRegion这个函数会做越界检查,如果检查发现越界了,会抛出StringIndexOutOfBoundsException异常,这个方法与GetStringUTFChars比较相似,不同的是,GetStringUTFRegion内部不分配内存,不会抛出内存溢出异常。
GetStringUTFRegion和GetStringRegion这两个函数由于内部没有分配内存,所以JNI没有提供ReleaseStringUTFRegion和ReleaseStringRegion这样的函数。

字符串总结

上一篇 下一篇

猜你喜欢

热点阅读