android串口操作--清除缓存

本文介绍如何为Google的SerialPort_Project项目添加清除缓存的功能。通过修改SerialPort.c和SerialPort.h文件,实现了一个新的tcflush方法,并详细记录了配置NDK及编译步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需要,用到了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了。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值