[問題] Android Jni 與 C 傳 char 陣列

看板AndroidDev作者 (Aesthetic)時間13年前 (2011/08/21 12:13), 編輯推噓2(209)
留言11則, 2人參與, 最新討論串1/1
這是一個我用Android NDK 調用 JNI 我自己寫的C函式庫的code C的code普通執行的時候確實 能夠把我要得到的RS232數據傳入然後做檢測之後轉為十進位的數值 但是在這裡面就無法了 當我把Android的char陣列傳到JNI,然後做了事情回傳之後 我去檢查那個buffer 他就給我一個亂碼 我試過在Jni的.c檔裡面 把char類型的buffer陣列='Z' ,回傳之後的確 檢測是Z,但是只要是想要把Rs232數據memcpy進來,數據就都會是亂碼, 應該說在Android Java裡面檢視Logcat都是亂碼,查了很多資料都沒有解決辦法。 是網路上所說的char大小Java和C不同嗎? 有請高手大大解釋一下 另外從RS232裡面傳出來的值是16進位的數值 http://pastebin.com/mrB0bsSd這個是Code所在的網站 下面也是 =======================Android Java Code============================= 這裡是片段 public native int OpenPort(int portnum,int brates); public native int ClosePort(int portnum); public native int READ(char[] databuffer); public char[] buffer=new char[40]; int i; for(i=0;i<40;i++) buffer[i]='s'; //初始化 OpenPort(16,9600); 自己寫的開Port while (i<1000) { READ(buffer); i++; } =====================以下為JNI.c code=============================== JNIEXPORT jint JNICALL Java_com_example_ndk_Vehicles_READ(JNIEnv *env, jclass cls,jcharArray databuffer) { char tmp[40]; jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0); memset(tmp,0,sizeof(tmp)); PollComport(16,tmp,40); memcpy(buffer,tmp,40); (*env)->ReleaseCharArrayElements(env, databuffer, buffer, 0); return 0; } ========================================================================== 有請大大幫忙看一下 折騰了好幾天 很累=_= -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.112.16

08/21 19:07, , 1F
雖然說這是不隊的 不過把ReleaseCharArrayElements mark
08/21 19:07, 1F

08/21 19:09, , 2F
掉 跟 調整最後一個參數0->JNI_COMMIT看有沒有至少正常?
08/21 19:09, 2F

08/21 19:10, , 3F
我是覺得看起來要(env,databuffer,buffer,JNI_COMMIT)
08/21 19:10, 3F

08/21 19:23, , 4F
阿靠 不要用CharArray傳這種東西 =___= 我居然沒看到
08/21 19:23, 4F

08/21 19:24, , 5F
因為char在C/Java解釋是完全不同的兩個東西 不能這樣做
08/21 19:24, 5F

08/21 19:26, , 6F
比方說一個中文字(或者utf-8在0x00FF後的字元)在java是
08/21 19:26, 6F

08/21 19:26, , 7F
一個char 可是在C裡面是兩個char
08/21 19:26, 7F

08/21 19:26, , 8F
自然只要有超過ascii的過jni就會變亂碼了
08/21 19:26, 8F

08/21 20:13, , 9F
我倒是比較好奇為什麼稱為亂碼。單純存數字應該沒問題
08/21 20:13, 9F

08/21 20:13, , 10F
只是印出來沒有意義就是了。
08/21 20:13, 10F

08/21 21:37, , 11F
數字沒超過ascii阿 印印看純ascii應該不會有問題
08/21 21:37, 11F
文章代碼(AID): #1EK8NmRC (AndroidDev)
文章代碼(AID): #1EK8NmRC (AndroidDev)