android串口操作--清除缓存
项目需要,用到了google的串口通讯代码:SerialPort_Project,具体代码参照github里面的。
代码里面默认的native api只有简单的open和close,没有关于清除缓存的api,故添加之。
在改代码前先配置好ndk和环境变量。
以android studio为例:
android studio从3.0开始貌似默认集成ndk选项,但仍然需要自行下载。
先在如上选项中勾选:Auto-detect proxy settings ,否则看不到下一步的操作。
勾选CMAKE,LLDB,NDK,如果用的是国内镜像地址,可能是没有这几项的。
下载完成后接着配置android NDK location
android studio段配置完成后,还需要配置windows端的系统环境变量。在path中加入ndk路径,记得重启一下电脑。
这时候在Terminal中输入ndk-build,会有相应的提示,如果提示无法找到相关命令,请认真检查一遍。
接着是改代码。
google项目的jni里面有源码,我主要改动的是SerialPort.c和SerialPort.h:
在SerialProt.c里面添加:
/* *Class : android_serial_SerialPort *Method : tcflush *Signature ()V */ JNIEXPORT void JNICALL Java_android_1serialport_1api_SerialPort_tcflush (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", "Ljava/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("tcflush(fd = %d)", descriptor); tcflush(descriptor, TCIOFLUSH); }
另外在.h文件里面添加相关的申明。
jni目录里面的Android.mk和Application.mk都是现成可用的,把APP_PLATFORM版本对应上。
打开android sdutio的Treminal,cd到jni目录,直接输入:ndk-build,就会自动生成相应的libserial_port.so .
最后在SerialPort.java中添加刚加入的
public native void tcflush();然后在应用中就可以有清除缓存这个api了。