JNI基础(6): JNI中字符串

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的解释如下:

  1. isCopy 作为返回值存在。
  2. 如果返回的字符串是原始字符串java.lang.String的一份拷贝,则isCopy 被赋值为JNI_TRUE
  3. 如果返回的字符串和原始字符串指向的是JVM中的同一份数据,则isCopy 被赋值为JNI_FALSE。当isCopy 为JNI_FALSE时,本地代码绝不能修改字符串的内容,否则JVM中的原始字符串也会被修改,这会打破Java语言中字符串不可变的规则。
  4. 通常,我们不必关心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());
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容