作者skyhigh8988 (Aesthetic)
看板AndroidDev
标题[问题] Android Jni 与 C 传 char 阵列
时间Sun Aug 21 12:13:33 2011
这是一个我用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
1F:→ Killercat:虽然说这是不队的 不过把ReleaseCharArrayElements mark 08/21 19:07
2F:→ Killercat:掉 跟 调整最後一个参数0->JNI_COMMIT看有没有至少正常? 08/21 19:09
3F:→ Killercat:我是觉得看起来要(env,databuffer,buffer,JNI_COMMIT) 08/21 19:10
4F:推 Killercat:阿靠 不要用CharArray传这种东西 =___= 我居然没看到 08/21 19:23
5F:→ Killercat:因为char在C/Java解释是完全不同的两个东西 不能这样做 08/21 19:24
6F:→ Killercat:比方说一个中文字(或者utf-8在0x00FF後的字元)在java是 08/21 19:26
7F:→ Killercat:一个char 可是在C里面是两个char 08/21 19:26
8F:→ Killercat:自然只要有超过ascii的过jni就会变乱码了 08/21 19:26
9F:推 qrtt1:我倒是比较好奇为什麽称为乱码。单纯存数字应该没问题 08/21 20:13
10F:→ qrtt1:只是印出来没有意义就是了。 08/21 20:13
11F:→ Killercat:数字没超过ascii阿 印印看纯ascii应该不会有问题 08/21 21:37