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