我遇到过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:
-
您可以强制
NDK_MIN_PLATFORM_LEVEL=9
(在ndk-build命令行上)以避免警告。但是NDK没有android-10,并且使用r15时,您应该在命令行中显式选择APP_PLATFORM=android-9
。FWIW,您可以使用android-14,除非您项目的其他部分不兼容。 -
您应该设置
APP_DEPRECATED_HEADERS=true
,然后标头将与r14完全相同,这样就可以避免统一标头中的错误。
r15的统一标头中可能有一个错误,他们只为MIPS将 今年晚些时候,r16将删除platform/android-14/arch-arm/usr/include等不推荐使用的头文件,如果情况最糟,则在r17中删除。android-9兼容的库也可能会消失。TCSANOW
设置为TCSETS
如果您使用CMake,您应该在模块build.gradle.中添加此代码
externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_DEPRECATED_HEADERS=ON"
}
}