NDK15中断串行端口库



我遇到过NDK试图更改和重建COM端口的本机串行端口库的不良行为。这是众所周知的旧代码,你可以在这里找到它(不是我的)https://github.com/NanFengyang/AndroidSerialPort/blob/master/app/src/main/jni/SerialPort.c#L126

请注意字符串126,这是问题的一个要点。

NDK15两次让我大吃一惊:

首先,这个新的警告。

Android NDK:在中找到平台级别/project.properties.SettingAPP_PLATFORM到android-10。Android NDK:Android-10不受支持。使用最低支持版本android-14。

Android NDK:警告:APP_PLATFORM android-14高于安卓系统:minSdkVersion 10 in./AndroidManifest.xml。NDK二进制文件将与兼容比android-14更老的设备。看见https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md了解更多信息。

下一步,打开COM时失败,显示如下:

配置串行端口

tcsetattr()失败(fd=40,err=22)

这是我的简单伪代码的输出

struct termios cfg;
LOGD("Configuring serial port");
if (tcgetattr(fd, &cfg)){
LOGE("tcgetattr() failed (fd = %d, err = %d)", fd, errno);
}
if (tcsetattr(fd, TCSANOW, &cfg)){
LOGE("tcsetattr() failed (fd = %d, err = %d)", fd, errno);
}

只有NDK 15才会出现此错误。它成功地进行了修订14b、13b、12b。。。对于面临它的人来说——只需下载旧的NDK。

最后,问题。错误22为[EINVAL]-"optional_actions参数不是支持的值,或者试图将termios结构中表示的属性更改为不支持的值">

如果您想使用NDKr15

  1. 您可以强制NDK_MIN_PLATFORM_LEVEL=9(在ndk-build命令行上)以避免警告。但是NDK没有android-10,并且使用r15时,您应该在命令行中显式选择APP_PLATFORM=android-9。FWIW,您可以使用android-14,除非您项目的其他部分不兼容。

  2. 您应该设置APP_DEPRECATED_HEADERS=true,然后标头将与r14完全相同,这样就可以避免统一标头中的错误。

r15的统一标头中可能有一个错误,他们只为MIPSTCSANOW设置为TCSETS

今年晚些时候,r16将删除platform/android-14/arch-arm/usr/include等不推荐使用的头文件,如果情况最糟,则在r17中删除。android-9兼容的库也可能会消失。

如果您使用CMake,您应该在模块build.gradle.中添加此代码

externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_DEPRECATED_HEADERS=ON"
}
}

最新更新