本教學適用於ios系統,決勝時刻手遊在國區還未上線,那麼,如何下載及登陸呢?接下來小編為您帶來相關教學。1首先,在桌面開啟【App Store】,在搜尋欄中搜尋【決勝時刻】,可以看到,結果
2020-11-29 13:46:59
在android ndk開發的過程中,經常會遇到字串的問題,但是 jstring 這個型別又不同於一般的陣列,那麼String的具體的操作該怎麼進行了?程式碼主要涉及:
① UTF編碼轉換(一般情況下夠用,由於系統提供介面,所以比較簡單);
② 其他編碼格式轉換;
方便他人亦是方便自己,如果覺得還行就點下右邊的投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!
UTF由於有系統提供了介面實現起來非常的簡單,主要涉及四個介面,如下圖所示:
獲取String類的方法的函數簽名:
① 系統的原始碼目錄,找android.jar
如我的是:"D:Androidadt-bundle-windows-x86_64-20140702sdkplatformsandroid-19android.jar"
② 解壓 android.jar 到目錄 android 裡面
③ 開啟cmd,cd到該目錄
如我的是「D:Androidadt-bundle-windows-x86_64-20140702sdkplatformsandroid-19」
④ 執行cmd指令:javap -classpath android -s java.lang.String
查詢的結果如下圖所示:
public byte[] getBytes(java.lang.String) throws java.io.UnsupportedEncodingException;
descriptor: (Ljava/lang/String;)[B
android上面支援的字元集有,如下圖所示:
註:該字元集必須以android原始碼中的註釋為主,不同的平台支援的字元集可能不相同;
String類建構函式的簽名:
public java.lang.String(byte[], java.lang.String) throws java.io.UnsupportedEncodingException; descriptor: ([BLjava/lang/String;)V
下面的這個函數是實現了 jstring 到 char 的轉換;
pEnv 為當前的環境變數;
ppChars 為從jstring中獲取到的最終的char陣列,記憶體由函數內部開闢;
pLength 為jstring的長度;
jstr 為需要轉換的jstring型別;
szCharset 這裡傳字元集,「前期準備」部分有介紹
註:① Java裡面的String並不是按照 結束,並作為結束符,所以必須返回字串的長度
② 該測試用例並沒有做例外處理,使用者可以自行補充上;
完整程式碼如下:
int jstring2char(JNIEnv* pEnv, char** ppChars, int* pLength, jstring jstr, char* szCharset)
{ jclass clsString = pEnv->FindClass("java/lang/String"); jstring charset = pEnv->NewStringUTF(szCharset); jmethodID method = pEnv->GetMethodID(clsString, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray byteArray = (jbyteArray) pEnv->CallObjectMethod(jstr, method, charset);
jsize nLength = pEnv->GetArrayLength(byteArray);
jbyte* bytes = pEnv->GetByteArrayElements(byteArray, JNI_FALSE);
*pLength = nLength; *ppChars = (char*) malloc(nLength); memcpy(*ppChars, bytes, nLength);
pEnv->ReleaseByteArrayElements(byteArray, bytes, 0); pEnv->DeleteLocalRef(charset);
return 1;}
下面的這個函數是實現了 char 到 jstring 的轉換;
完整的程式碼如下:
jstring char2jstring(JNIEnv* pEnv, char* pChars, int Length, char* szCharset) {
jclass clsString = pEnv->FindClass("java/lang/String");
/// <init>屬於建構函式的範疇
jmethodID construct = pEnv->GetMethodID(clsString, "<init>", "([BLjava/lang/String;)V");
jbyteArray byteArray = pEnv->NewByteArray(Length);
pEnv->SetByteArrayRegion(byteArray, 0, Length, (jbyte*) pChars);
jstring charset = pEnv->NewStringUTF(szCharset);
jstring strDst = (jstring) pEnv->NewObject(clsString, construct, byteArray, charset);
pEnv->DeleteLocalRef(byteArray);
return strDst;}
下面是一個完整的測試用例,將java層傳進來的 jstring 複製一份後重新傳回去,完整的程式碼如下:
JNIEXPORT jstring JNICALL Java_ndk_jniarray_MainActivity_swapString (JNIEnv *pEnv, jclass clsActivity, jstring src) {
char* pUtf = NULL;
int nLength = 0;
jstring2char(pEnv, &pUtf, &nLength, src, "UTF-8");
jstring dst = char2jstring(pEnv, pUtf, nLength, "UTF-8");
free(pUtf);
return dst;
}
方便他人亦是方便自己,如果覺得還行就點下下邊的投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!
相關文章
本教學適用於ios系統,決勝時刻手遊在國區還未上線,那麼,如何下載及登陸呢?接下來小編為您帶來相關教學。1首先,在桌面開啟【App Store】,在搜尋欄中搜尋【決勝時刻】,可以看到,結果
2020-11-29 13:46:59
當我們在玩決勝時刻11-決勝時刻的時候如何進入監獄呢?1進入監獄,被士兵拉下車後,可以看到開啟的門,按住w鍵向大門走去,等待電梯的下降。 2隊友被拽倒在地,按住w繼續往前走,被帶著頭
2020-11-29 05:28:59
悟飯趣玩是一款可以直接下載遊戲的一款軟體,有很多朋友不知道如何下載,我在這裡出個教學。有需要的朋友可以看看。1第一步,開啟手機悟飯趣玩。 2第二步,點選psp類型遊戲。 3
2020-07-23 10:29:44
ps4惡靈古堡6怎麼雙人呢,還是有很多的小夥伴們不知道吧,現在我就來為朋友們簡單的介紹一下吧。1首先,我們大家先來一起看,如果是本地雙人的話就需要先進入我們的遊戲,再去選擇模
2020-07-23 10:29:42
許多小夥伴都喜歡玩墓麗影10:崛起那怎麼調中文字幕及語音?接下來我給大家簡單分享一下我的經驗,這次的古墓奇兵還有中文語音哦!1首先,我們開啟電腦,進入遊戲古墓奇兵這款遊戲,進入
2020-07-23 10:29:30
現在使用蘋果手機的小夥伴越來越多,那麼很多人想在蘋果手機上下載facebook卻不知道具體的操作方法,這裡小編就給大家介紹下蘋果手機怎麼下載facebook,希望能幫助到大家。 1首先
2019-12-26 05:53:33