NDK 15中断串行端口库
我面对NDK的不良行为,试图更改和重建COM端口的本地串行端口库。这是众所周知的旧代码,你可以在这里找到它(不是我的) https://github.com/NanFengyang/AndroidSerialPort/blob/master/app/src/main/jni/SerialPort.c#L126NDK 15中断串行端口库
注意字符串126 - 这是问题的一点。
NDK15让我惊喜两次:
首先,这个新的警告。
Android NDK:在./project.properties中找到平台级别。设置 APP_PLATFORM到android-10。 Android NDK:android-10不受支持。 使用最低支持的版本android-14。
Android NDK:警告: APP_PLATFORM android-14比 ./AndroidManifest.xml中的android:minSdkVersion 10高。 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 ......对于面对它的人也是成功的 - 只需下载old NDK即可。
最后,的问题。 错误22是[EINVAL] - “optional_actions参数不是支持的值,或者尝试将termios结构中表示的属性更改为不支持的值”。有人知道如何避免它在新的NDK?
如果你想使用NDK R15:
您可以强制
NDK_MIN_PLATFORM_LEVEL=9
(上NDK,建立命令行),以避免该警告。但NDK没有android-10和r15您应该在命令行上明确选择APP_PLATFORM=android-9
。 FWIW,除非项目的其他部分不兼容,否则您可以使用android-14。您应该设置
APP_DEPRECATED_HEADERS=true
,那么标题将与r14完全相同,您将避免统一标题中的错误。
有可能是在R15统一的头一个bug,他们只设置TCSANOW
到TCSETS
为MIPS,但不支持其他的ABI。
已被废弃的头平台/ Android的14 /弓臂/ usr/include目录等will be removed在R16今年晚些时候,或者,如果在最坏的情况下,在R17。与兼容的库也可能会消失。
如果您使用CMake,您应该将此代码添加到您的模块build.gradle。
externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_DEPRECATED_HEADERS=ON"
}
}
我只是在终端中运行ndk-build。最糟糕的是,没有gradle(旧项目)。你不知道在这种情况下做什么?谢谢 – djdance
可以提供在哪里设置APP_DEPRECATED_HEADERS = true的例子,我不是那么熟悉,只是知道该怎么办好NDK构建和打造LIB – djdance
如果你有Application.mk,你可以把它放在那里。或者在ndk-build命令行上。 –