日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android jni jstring 转 char*

發布時間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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*的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。