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.
2 年多之前 回复
qq_27564553
qq_27564553 回复Keven1988: 他返回的是实际读到的数据量,第三个表示只读了一个字节,读到了当然返回1了,你当然可以一次性都读到一个buff就好了
2 年多之前 回复
Keven1988
Keven1988 您好,我看了下之前同事写好的程序,read()返回的不是读到的数据,而是如果读到数据,则返回1,
2 年多之前 回复
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中
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android Studio如何在项目中使用jni以及OpenCV库
Android Studio如何在项目中使用jni以及OpenCV库由于公司这一个项目是将之前运行在Linux上的代码移植到Android上,所以需要学习使用jni将原来的C++代码打包成so库,然后在Android调用,本人百度、Google了许多资料,终于搞定了,分享给各位需要使用jni的程序猿们,好了,废话不多说,开始搞起。在开始配置前,大家需要下载Android Studio(以下简称AS)
Android JNI + AIDL: 第1篇: Android JNI 编程
1. Android's JNI Android JNI编程说到底就是3个步骤,   (1) ①在需要调用本地C/C++实现的API的上层APK的编程中,先声明和引用native性质的jni的java接口,这个java接口的命名可以随意,调用和其他接口一样,声明标注public native性质 例子:   ②利用JDK 生成JNI的头文件。根据这个JNIjava接口的声明和调用,生成JN
JNI与C/C++的调用与封装(Demo应用)
&amp;gt; 项目中使用JNI的地方,如:核心逻辑,密钥,加密逻辑。JNI还有很多的应用,比如FFMPEG,OpenGL等。JNI常见的场景如:加解密算法,音视频编解码等。C/C++实现的算法,JNI封装(SO文件,动态链接文件),Java、Android上层调用(可封装成Jar、SDK形式)。(分层思想)多考虑文件的接口, 流的接口, 而不是仅仅是对象的接口, 这样会让JNI的设计更加优雅.&amp;gt;...
android studio jni cmake(2)已有项目上增加jni
欢在一个已存在的项目上增加jni cmake方式通过使用ndk的方式增加一个native库,需要在创建jni文件夹,然后在文件夹中创建C或C++源文件,头文件,Android.mk和Application.mk文件,然后通过调用ndk-build命令进行编译,生成动态链接库.so文件,最后在java类中调用。通过以下步骤就可以讲一个不含native代码的工程或以前使用ndk构建的项目 更改为一个使用
Android Studio3.0开发JNI流程------C++调用Java以及Java调用C++,C++/Java互相调用
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
android jni方式调用c++代码并在其它app中使用生成的.so文件
搞了一下午终于明白了一点机制,网上的代码太乱了,很多不经过验证就转载的,强烈谴责这种行为,以下所写都是android studio测试运行过的,欢迎交流指正。运行前提是在project structure中配置好ndk路径。想看入门demo的童鞋不要再到处下载了,ndk文件目录下有一个samples,里面都是官方demo,例如hello-jni,不过是eclipse的项目哦。 1.使用androi
Android Studio开发jni实例详解 (调用C代码实例)
一、配置NDK环境 第一步:在AndroidStudio中配置ndk环境 需要下载ndk包,在AndroidStudio中File-->ProjectStructure-->SDK Location中配置"Android NDK Location",如下: 下载安装完成后build工程; 第二步:配置环境变量 在计算机属性里面配置环境变量,变量地址是And
Android底层调用C代码(JNI实现)
Android底层调用C代码(JNI实现) 一、基础知识 二、从Android框架角度简单分析JNI 三、标准JNI实现步骤 四、实现JNI过程实例 一、基础知识 1、JNI:百度百科中解释:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。 (然而就像官话一样难理解)。 个人理解,JNI就是一个
Android使用JNI调用C代码的例子
这是一个在Android studio上写的一个Android 使用jni调用c代码的例子,详情请看我的博客地址:http://blog.csdn.net/qq_27512671/article/details/51149912
Android JNI中C和JAVA代码之间的互相调用
一、C语言代码回调Java方法 1. C代码回调Java方法的流程 (1) 找到java对应的Class 创建一个char*数组, 然后使用jni.h中提供的FindClass方法获取jclass返回值; char* classname = "wjy/geridge/com/testndk/jni/JniUtils"; jclass dpclazz = (*env)->Fi