JNI中的字符串单独那出来讲的原因是除了基础类型以外字符串用的还是比较频繁。JNI中字符串的对象为jstring,继承自jobject。获取jstring中的c string 需要通过env的提供的如下方法:
//从jstring获取一个c_string,此方法会开辟内存需要手动释放
const char* c_str = env->GetStringUTFChars(str, 0);
env->ReleaseStringUTFChars(str, c_str);
//jni中获取string的长度
env->GetStringUTFLength(str);
//截取字符串
char buf[128];
env->GetStringUTFRegion(str, 0, 4, buf);
//创建一个jstring,会再JVM中释放,可以不删除
jstring jstr = env->NewStringUTF("MemetGhini");
//可以通过DeleteLocalRef来删除引用变量
env->DeleteLocalRef(jstr);
在函数const char* GetStringUTFChars(jstring string, jboolean* isCopy)
中第二个参数isCopy的解释如下:
- isCopy 作为返回值存在。
- 如果返回的字符串是原始字符串java.lang.String的一份拷贝,则isCopy 被赋值为
JNI_TRUE
。 - 如果返回的字符串和原始字符串指向的是JVM中的同一份数据,则isCopy 被赋值为
JNI_FALSE
。当isCopy 为JNI_FALSE时,本地代码绝不能修改字符串的内容,否则JVM中的原始字符串也会被修改,这会打破Java语言中字符串不可变的规则。 - 通常,我们不必关心JVM是否会返回原始字符串的拷贝,只需要为isCopy传递NULL或者0作为参数。
最常用的两个转换 例如:
std::string jstring2string(JNIEnv*env, jstring jstr)
{
const char* tmpStr = env->GetStringUTFChars(jstr, nullptr);
std::string ret(tmpStr);
env->ReleaseStringUTFChars(jstr, tmpStr);
return ret;
}
jstring string2jstring(JNIEnv* env, std::string str)
{
return env->NewStringUTF(str.c_str());
}
网友评论