android应用与节点通讯的方式有很多种,比如可以通过LocalSoeckt、FileOutputStream、jni等方式进行通讯。
这里用jni的方式介绍一下如何向节点写数据,要向节点里面写数据要知道节点名是什么,节点名一般是由android系统开发人员提供。向节点写数据通常来说就是应用直接向驱动写数据。
具体代码如下:
#include "LEDOption.h"
#include <fcntl.h>
#include <unistd.h>
#include <android/log.h>
#define LOGE(FORMAT,...)__android_log_print(ANDROID_LOG_INFO,"Wayne",FORMAT,##__VA_ARGS__)
char OPEN_LED = '0';
char CLOSE_LED = '1';
int openLED() {
//1.首先要打开节点,fcntl.h下的open函数打开节点
int pointState = -1;
int result = 0;
pointState = open(AUX_SOURCE_LED, O_RDWR);//打开节点如果成功返回值会大于0,如果失败返回-1
if (pointState < 0) {
//说明打开该节点失败,那就会把通道关闭
close(pointState);
pointState = -1;
LOGE("open point failure = %s",AUX_SOURCE_LED);
return pointState;
}
//如果成功那就可以向节点写数据了
//这里要注意一下write和ioctl的区别,向驱动写数据应该要用write,ioctl也可以写数据,
// 但是ioctl是用来向I/O写数据,如果用ioctl向驱动是写失败的
result = write(pointState,&OPEN_LED,1);//write的返回值是如果成功写入会返回写到驱动的数据大小,如果失败则返回0
if(result>0){
LOGE("write data successful data size is %d",result);
}
close(pointState);
return result;
}
int closeLED() {
int pointState = -1;
int result = 0;
pointState = open(AUX_SOURCE_LED, O_RDWR);//打开节点如果成功返回值会大于0,如果失败返回-1
if (pointState < 0) {
//说明打开该节点失败,那就会把通道关闭
close(pointState);
pointState = -1;
LOGE("open point failure = %s",AUX_SOURCE_LED);
return pointState;
}
//如果成功那就可以向节点写数据了
//这里要注意一下write和ioctl的区别,向驱动写数据应该要用write,ioctl也可以写数据,
// 但是ioctl是用来向I/O写数据,如果用ioctl向驱动是写失败的
result = write(pointState,&CLOSE_LED,1);//write的返回值是如果成功写入会返回写到驱动的数据大小,如果失败则返回0
if(result>0){
LOGE("write data successful data size is %d",result);
}
close(pointState);
return result;
}
可以发现用jni向节点写数据代码量会比java的要少。
好啦!今天就分享到这里了。
网友评论