2 keven1988 Keven1988 于 2016.04.05 11:20 提问

android项目中JNI调用的C代码

最近的一个项目,需要通过JNI在串口中读取数据,读取数据并返回的代码是用C语言写的。我对C语言很陌生,哪位大神帮帮忙,帮忙撸几句代码。
JNIEXPORT jbyteArray JNICALL Java_com_cem_serialdevdemo_CodeJNI_ReadRfidSerialPort
(JNIEnv env, jobject obj)
{
//大致的思路是:
int rev=0;
unsigned char sof;
unsigned char buf[20];
rev=read(s_fdRfid,&sof,1)
//判断读取到数据时:
//判断读取到的数据与通信协议的格式是否相同
//首先判断前三个字节与通信协议的前三个识别码是否相同
//再判断末尾两个字节与通信协议的后两个识别码是否相同
//再取出中间的四个字节,转换为jbyteArray后返回
//未读到数据或者数据格式不对时:返回"0"
char *fail="0";
jbyteArray byteArray = (*env)->NewByteArray(env, 1/*strlen(cp)
/);
(*env)->SetByteArrayRegion(env, byteArray, 0, 1/*strlen(cp)*/, (jbyte *)fail);
return byteArray;图片说明
}

4个回答

CSDNXIAOS
CSDNXIAOS   2016.04.05 11:33

学习网站:

系统的学习网站:http://helloxuweifu.iteye.com/blog/1168647
http://www.chinavideo.org/viewthread.php?tid=10870
http://blog.csdn.net/bigapple88/article/details/6756204......
答案就在这里:android中如何通过jni调用c,c++代码
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

qq_27564553
qq_27564553   2016.04.05 16:08

主要还是read()的用法,三个参数,分别是从哪里读,读到哪里,读多少
满足你第一个要求就是if(read(s_fdRfid,&buf[0],1))进去就是读到了,因为read返回实际读到的数据,前提是不管你s_fdRfid是这个句柄是否可以存在且读到东西。后面的就是加加减减的事啦,buf[0]buf[1].....

qq_27564553
qq_27564553 回复Keven1988: 比如read(hFile,buf, 20),就是从hFile中读20个字节,当时实际上他只读了15个,就返回15.
一年多之前 回复
qq_27564553
qq_27564553 回复Keven1988: 他返回的是实际读到的数据量,第三个表示只读了一个字节,读到了当然返回1了,你当然可以一次性都读到一个buff就好了
一年多之前 回复
Keven1988
Keven1988 您好,我看了下之前同事写好的程序,read()返回的不是读到的数据,而是如果读到数据,则返回1,
一年多之前 回复
qq_27564553
qq_27564553   2016.04.05 16:09

read返回实际读到的数据数

Keven1988
Keven1988   2016.04.06 11:14

您好,我看了下之前同事写好的程序,read()返回的不是读到的数据,而是如果读到数据,则返回1,
我这样写,同事说不是很好!

int rev=0,len=0;
unsigned char buf[20];
unsigned char sof;
char *fail="0";

//读取数据
rev=read(s_fdRfid,&sof,1);
        if (rev==1 && sof==0xFF) {
            rev=read(s_fdRfid,&sof,1);
            if (rev==1 && sof==0x03) {
                rev=read(s_fdRfid,&sof,1);
                if (rev==1 && sof==0x04) {
                    for(len=0;len<4;len++){
                        rev=read(s_fdRfid,&sof,1);
                    buf[len]=sof;
                    }
                    rev=read(s_fdRfid,&sof,1);
                    if (rev==1 && sof==0x00) {
                        rev=read(s_fdRfid,&sof,1);
                        if (rev==1 && sof==0x00) {
                            jbyteArray byteArray = (*env)->NewByteArray(env, len);
                            (*env)->SetByteArrayRegion(env, byteArray, 0, len, (jbyte *)buf);
                            return byteArray;
                        }else{
                            //失败时返回"0"
                            jbyteArray byteArray = (*env)->NewByteArray(env, 1/*strlen(cp)*/);
                            (*env)->SetByteArrayRegion(env, byteArray, 0, 1/*strlen(cp)*/, (jbyte *)fail);
                            return byteArray;
                        }
                    }
                }
            }
        }

        能指点一下吗? 
qq_27564553
qq_27564553 就像上面说的不要一次读一个,一次性读到一个buff中
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!