JNI中的字符串單獨那出來講的原因是除了基礎類型以外字符串用的還是比較頻繁啰脚。JNI中字符串的對象為jstring,繼承自jobject实夹。獲取jstring中的c string 需要通過env的提供的如下方法:
//從jstring獲取一個c_string,此方法會開辟內(nèi)存需要手動釋放
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);
//創(chuàng)建一個jstring橄浓,會再JVM中釋放荸实,可以不刪除
jstring jstr = env->NewStringUTF("MemetGhini");
//可以通過DeleteLocalRef來刪除引用變量
env->DeleteLocalRef(jstr);
在函數(shù)const char* GetStringUTFChars(jstring string, jboolean* isCopy)
中第二個參數(shù)isCopy的解釋如下:
- isCopy 作為返回值存在。
- 如果返回的字符串是原始字符串java.lang.String的一份拷貝准给,則isCopy 被賦值為
JNI_TRUE
畔规。 - 如果返回的字符串和原始字符串指向的是JVM中的同一份數(shù)據(jù)莫绣,則isCopy 被賦值為
JNI_FALSE
模燥。當isCopy 為JNI_FALSE時,本地代碼絕不能修改字符串的內(nèi)容软驰,否則JVM中的原始字符串也會被修改涧窒,這會打破Java語言中字符串不可變的規(guī)則。 - 通常慧瘤,我們不必關(guān)心JVM是否會返回原始字符串的拷貝戴已,只需要為isCopy傳遞NULL或者0作為參數(shù)。
最常用的兩個轉(zhuǎn)換 例如:
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());
}