From abd31fd9f99f225d11f9df1ae33f93a419c9d24d Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Sat, 4 Jan 2020 23:00:17 +0000 Subject: [PATCH] android: Fix build compatibility with NDK platform 21 and up. In platforms 21 and higher of the NDK, linux/serial.h is available, which it was not before. This broke the build, because the configure script would detect the availability of 'struct serial_struct' in that header and set HAVE_STRUCT_SERIAL_STRUCT, but the #ifndef __ANDROID__ in libserialport_internal.h stopped us actually including the header. This change fixes things to build with all versions of the NDK, and is tested with builds for arm from versions 9 to 24. Version 21 also added availability of tcdrain(), so we also use that where available, and only use the direct ioctl() method on NDK < 21. Fixes #1078. --- libserialport_internal.h | 5 +++-- serialport.c | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libserialport_internal.h b/libserialport_internal.h index 0ad6f70..35aa6f9 100644 --- a/libserialport_internal.h +++ b/libserialport_internal.h @@ -68,8 +68,9 @@ #endif #ifdef __linux__ #include -#ifndef __ANDROID__ -#include "linux/serial.h" +/* Android only has linux/serial.h from platform 21 onwards. */ +#if !(defined(__ANDROID__) && (__ANDROID_API__ < 21)) +#include #endif #include "linux_termios.h" diff --git a/serialport.c b/serialport.c index 9e56e89..c233b28 100644 --- a/serialport.c +++ b/serialport.c @@ -742,7 +742,9 @@ SP_API enum sp_return sp_drain(struct sp_port *port) #else int result; while (1) { -#ifdef __ANDROID__ +#if defined(__ANDROID__) && (__ANDROID_API__ < 21) + /* Android only has tcdrain from platform 21 onwards. + * On previous API versions, use the ioctl directly. */ int arg = 1; result = ioctl(port->fd, TCSBRK, &arg); #else