android jni jstring 转 char*
今天,簡單講講Android jni如何將java的Sring轉(zhuǎn)成char*。
這個(gè)之前一直不理解,所以我都是android傳入byte[]轉(zhuǎn)成char*,有一篇博客專門講了這個(gè)。后來發(fā)現(xiàn)用String轉(zhuǎn)成char*更加簡單。這里記錄一下。
C++版本如下:
//將char類型轉(zhuǎn)換成jstring類型 jstring CStr2Jstring( JNIEnv* env, const char* pat ) { // 定義java String類 strClass jclass strClass = (env)->FindClass("Ljava/lang/String;"); // 獲取java String類方法String(byte[],String)的構(gòu)造器,用于將本地byte[]數(shù)組轉(zhuǎn)換為一個(gè)新String jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); // 建立byte數(shù)組 jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat)); // 將char* 轉(zhuǎn)換為byte數(shù)組 (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //設(shè)置String, 保存語言類型,用于byte數(shù)組轉(zhuǎn)換至String時(shí)的參數(shù) jstring encoding = (env)->NewStringUTF("GB2312"); //將byte數(shù)組轉(zhuǎn)換為java String,并輸出 return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding); } char * Jstring2CStr( JNIEnv * env, jstring jstr ) { char * rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("GB2312"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode); jsize alen = env->GetArrayLength(barr); jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE); if(alen > 0) { rtn = (char*)malloc(alen+1); //new char[alen+1]; memcpy(rtn,ba,alen); rtn[alen]=0; } env->ReleaseByteArrayElements(barr,ba,0); return rtn; }
這個(gè)相當(dāng)于將string轉(zhuǎn)成byte,然后再轉(zhuǎn)成char*,應(yīng)該可以處理中文字符。如果只有英文字符,其實(shí)更加簡單。
使用GetStringUTFChars將jstring轉(zhuǎn)換成為UTF-8格式的char*,這樣就可以直接使用了。用完后需要釋放資源,使用ReleaseStringUTFChars釋放指向UTF-8格式的char*的指針。不過這個(gè)不可以處理中文字符。
具體講解GetStringUTFChars這個(gè)函數(shù):
?const?char*?GetStringUTFChars(JNIEnv*env, jstring string,?jboolean *isCopy);??
對第三個(gè)參數(shù)?jboolean *isCopy說明如下:
?????????????當(dāng)從JNI函數(shù)GetStringUTFChars函數(shù)中返回得到字符串B時(shí),如果B是原始字符串java.lang.String的一份拷貝,
??????則isCopy? 被賦值為JNI_TRUE。如果B是和原始字符串指向的是JVM中的同一份數(shù)據(jù),則isCopy? 被賦值為JNI_FALSE。
?????當(dāng)isCopy? 為JNI_FALSE時(shí),本地代碼絕不能修改字符串的內(nèi)容,否則JVM中的原始字符串也會被修改,這會打破Java語言
????? 中字符串不可變的規(guī)則。
??????????? 通常,我們不必關(guān)心JVM是否會返回原始字符串的拷貝,只需要為isCopy傳遞NULL或者0作為參數(shù) 。
android jni jstring 轉(zhuǎn) char*就講完了。
就這么簡單。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的android jni jstring 转 char*的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android jni 释放资源
- 下一篇: android jni new/dele