android ndk串口触屏,Aandroid NDK开发之串口控制
最近一个项目是android的系统,由于是工业产品,所以要用到串口,想着怎么去控制串口,有好些办法,最简单有效而且规范的办法就是google提供的NDK啦,其实还是蛮复杂的,因为android系统是个很花的系统,涉及到的知识面太广了。把代码贴在这,以后就不会忘了,嘎嘎.
下面是NDK部分所有的代码,需要注意的地方在最后面再讲:
/*
*Copyright 2100 Smallfish
*
*
*
*
*I love you.
*/
#include
#include
#include
#include
#include
#include
#include
#include
/*Android log
*/
#include
static const char *TAG="serialport for NFC Demo";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG,TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR,TAG, fmt, ##args)
static speed_t getBaudrate(jint baudrate)
{
switch(baudrate) {
case 0: return B0;
case 50: return B50;
case 75: return B75;
case 110: return B110;
case 134: return B134;
case 150: return B150;
case 200: return B200;
case 300: return B300;
case 600: return B600;
case 1200: return B1200;
case 1800: return B1800;
case 2400: return B2400;
case 4800: return B4800;
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
case 230400: return B230400;
case 460800: return B460800;
case 500000: return B500000;
case 576000: return B576000;
case 921600: return B921600;
case 1000000: return B1000000;
case 1152000: return B1152000;
case 1500000: return B1500000;
case 2000000: return B2000000;
case 2500000: return B2500000;
case 3000000: return B3000000;
case 3500000: return B3500000;
case 4000000: return B4000000;
default: return -1;
}//end of switch
}//end of getBaudrate
/*
*Class: SerialPort
*Method: open
*Signature: (Ljava/lang/String;)V
*/
JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open
(JNIEnv *env,jobject thiz,jstring path,jint baudrate)
{
int fd;
jobject mFileDescriptor;
speed_t speed;
/*Check baudrate */
{
speed = getBaudrate(baudrate);
if(-1 == speed)
{
LOGE("Invalid baudrate passed");
return NULL;
}
}//end of check baudrate
/* Open device */
{
jboolean iscopy;
const char *path_utf = (*env)->GetStringUTFChars(env,path,&iscopy);
LOGD("Opening serial port is:%s",path_utf);
fd = open(path_utf,O_RDWR);
LOGD("opend device fd:%d",fd);
(*env)->ReleaseStringUTFChars(env,path,path_utf);
if(-1 == fd)
{
LOGD("Open serial port Failed...");
return NULL;
}
}//end of Open Device
/* Configure device*/
{
struct termios s_cfg;
if(tcgetattr(fd,&s_cfg))
{
LOGE("Get default config failed...");
return NULL;
}
cfmakeraw(&s_cfg);
cfsetispeed(&s_cfg,speed);
cfsetospeed(&s_cfg,speed);
if(tcsetattr(fd,TCSANOW,&s_cfg))
{
close(fd);
LOGE("Configure serial port failed");
return NULL;
}
}//end of Configure device
/* Create a corresponding file descriptor via opend serial port*/
{
jclass cFileDescriptor = (*env)->FindClass(env,"java/io/FileDescriptor");
jmethodID iFileDescriptor = (*env)->GetMethodID(env,cFileDescriptor,"","()V");
jfieldID descriptorID = (*env)->GetFieldID(env,cFileDescriptor,"descriptor","I");
mFileDescriptor = (*env)->NewObject(env,cFileDescriptor,iFileDescriptor);
(*env)->SetIntField(env,mFileDescriptor,descriptorID,(jint)fd);
}
return mFileDescriptor;
}//end of open
/*
* Class: serial__SerialPort
* Method: close
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close
(JNIEnv *env,jobject thiz)
{
jclass SerialPortClass = (*env)->GetObjectClass(env,thiz);
jclass FileDescriptorClass = (*env)->FindClass(env,"java/io/FileDescriptor");
jfieldID mFdID = (*env)->GetFieldID(env,SerialPortClass,"mFd","java/io/FileDescriptor");
jfieldID descriptorID = (*env)->GetFieldID(env,FileDescriptorClass,"descriptor","I");
jobject mFd = (*env)->GetObjectField(env,thiz,mFdID);
jint descriptor = (*env)->GetIntField(env,mFd,descriptorID);
LOGD("Close device fd:%d",descriptor);
close(descriptor);
}
需要注意的是函数名称:Java_android_serialport_SerialPort_close
分解如下:Java_这个是不变的,照写就是了,android_serialport这个是包名,这里是什么,在上层里也必须是什么,SerialPort_close这个前面部分是类名,而后面的当然就是函数名称了。
好吧:就这样,以后补上.mk文件.
下面是整个java串口类的代码,就不多说了:
package android.serialport;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.util.Log;
public class SerialPort
{
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
//这是构造函数了,是做什么的我也不知道啊
public SerialPort(File device,int baudrate) throws SecurityException,IOException
{
//open device
mFd = open(device.getAbsolutePath(),baudrate);
if(mFd == null)
{
Log.e(TAG, "native open return NULL");
throw new IOException();
}
//建立输入输出流,就可以使用这2个流来发送和接收数据了
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}//end of SerialPort
//获取输入流
public InputStream GetInputStream()
{
return mFileInputStream;
}
//获取输出流
public OutputStream GetOutputStream()
{
return mFileOutputStream;
}
//加载库和声明函数的
private native static FileDescriptor open(String path,int baudrates);
private native void close();
static {
System.loadLibrary("serialport");
}
}//end of calss
android ndk串口触屏,Aandroid NDK开发之串口控制相关推荐
- 手机触屏版页面开发总结
经过一年的触屏版开发,每一个项目开始前总要做大量的准备,力求做到完美,但做下一个项目的时候总会发现上一个项目有着太多的不足.这应该就是成长吧!虽然不是什么大牛但也觉得有必要把一些技巧和经验记录下来,以 ...
- 〖Android〗屏幕触屏事件录制与回放
需求: 不管是做自动化测试的,还是传媒技术的,自动化操作Android App是一种操作需求: 自动化的操作可以节省很多的人力资源投入: 实现: Android UI界面的自动化,通常有两个方法: 1 ...
- [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印
前一篇文章讲述了Android实现图片Matrix矩阵类缩放.旋转.对比度.亮度.饱和度处理,但是真正的图片软件都是使用触屏实现图片缩放.移动.添加水印等功能,所以该篇文章主要通过setOnT ...
- android 触摸 事件,Android触屏事件和MotionEvent详解
Android屏幕操作 屏幕是用户和Android设备交互的主要媒介,屏幕分为触屏和非触屏.Android设备目前有四种类型:Android Phone,Android Tablet,Android ...
- 小爱触屏音响用php接口,小米小爱触屏音箱:这个“闹钟”不简单
2019年4月1日更新:(不是愚人节新闻)小米高级副总裁.中国区总裁王川宣布,小米小爱触屏音箱将于4月9日小米9周年感恩狂欢上正式发布,定价为299元.此前,这款音箱已有超过42万人参与公测. 这是触 ...
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...
- Android开发板串口(SerialPort)通信
Android开发板串口(SerialPort)通信 Roy88关注 22017.09.07 18:01:22字数 1,618阅读 28,511 前言: 最近在总是看见有人在群里面问一些串口通信相关的 ...
- Android NDK开发之旅1 NDK介绍
###一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Ja ...
- Android 中Touch(触屏)事件传递机制
版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...
- 触屏型测控电路:串口助手网络ping包 带笔划输入法 硬件终结版
测控方面的设计可能有的工程师已经做得多了,可是用的都是VC.VB或者CVI等等,都逃不过电脑,但没人喜欢抱着台电脑到处走动测试(比如我就很讨厌这样的传统测试方法),人们需要更新的测控理念,下面我将介绍 ...
最新文章
- Android之----Log详解(Log.v,Log.d,Log.i,Log.w,Log.e)
- HDU1166-敌兵布阵
- html5--3.7 input元素(6)
- careercup-递归和动态规划 9.2
- CentOS 7.x防火墙问题
- 【原】聊聊js代码异常监控
- pytorch之model.zero_grad() 与 optimizer.zero_grad()
- 单片机sleep函数的头文件_关于PIC单片机SLEEP指令
- python 快速排名发包_SEO怎么快速排名?SEO快排发包技术原理是怎么实现的呀?(悬赏5元) - 搜外问答...
- python生成的exe反编译
- 小米air2se耳机只有一边有声音怎么办_小米蓝牙耳机Air2 SE,169元是否值得购买?值...
- Matlab实现均值滤波
- Matlab R2019a Win64位 迅雷下载链接
- matlab计算惯性矩,动力总成主惯性矩计算及扭矩轴(TRA)位置确定
- 【python教程入门学习】Python转义字符及用法
- 使用spoon对java代码进行转换
- 逆向分析工具IDA与开源工具Ghidra、Cutter对比测评
- 亿级视频内容如何实时更新?
- 文献综述格式及写作技巧
- Android JetPack Room
热门文章
- ThinkPHP中使用聚合查询去重求和
- 如何在Java应用中提交Spark任务?
- Servlet生命周期与线程安全
- Linux误删C基本运行库libc.so.6处理方法
- iOS已发布应用中对异常信息捕获和处理(转)
- 解决Win7下JMF读取摄像头错误
- 190308每日一句
- 190303每日一句
- Atitit 非结构化数据管理法 目录 1. 什么是非结构化数据?	1 2. 对非结构化数据也即对全文数据的搜索主要有两种方法:	2 2.1. 顺序扫描法(Serial Scanning):	2 2
- Atitit nlp 自然语言处理的艺术 attilax著作 v2 t55.docx Atitit nlp 自然语言处理attilax总结 目录 1.1. 主要范畴	1 1.2. 研究难点