我遇到过NDK的不良行为,试图更改和重建COM端口的本机串口库。这是众所周知的旧代码,你可以在这里找到它(不是我的) https://github.com/NanFengyang/AndroidSerialPort/blob/master/app/src/main/jni/SerialPort.c#L126
注意字符串126 - 这是问题的关键点。
NDK15让我惊讶两次:
首先,这个新警告。
Android NDK:在./project.properties中找到平台级别。设置 APP_PLATFORM到android-10。 Android NDK:android-10不受支持。 使用最低支持版本android-14。
Android NDK:警告: APP_PLATFORM android-14高于android:minSdkVersion 10 in ./AndroidManifest.xml。 NDK二进制文件不可以兼容 早于android-14的设备。看到 https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md 了解更多信息。
接下来,在打开COM时,它失败了:
配置串口
tcsetattr()失败(fd = 40,错误= 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结构中表示的属性更改为不受支持的值&#34 ;。有人知道如何在新的NDK中避免它吗?
答案 0 :(得分:2)
如果您想使用NDK r15 :
您可以强制NDK_MIN_PLATFORM_LEVEL=9
(在 ndk-build 命令行上)以避免出现警告。但NDK没有 android-10 ,而 r15 你应该在命令行中明确选择APP_PLATFORM=android-9
。 FWIW,您可以使用 android-14 ,除非项目的其他部分不兼容。
您应该设置APP_DEPRECATED_HEADERS=true
,然后标题与 r14 完全相同,您将避免统一标题中的错误。
r15 的统一标题中可能有bug,他们只将 TCSANOW
设置为 TCSETS
MIPS ,但不适用于其他ABI。
今年晚些时候 r16 中已弃用的标题 platforms / android-14 / arch-arm / usr / include 等will be removed,或者,如果在最坏的情况,在 r17 。 android-9 兼容的库也可能会消失。
答案 1 :(得分:0)
如果您使用CMake,则应在模块 build.gradle 中添加此代码。
externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_DEPRECATED_HEADERS=ON"
}
}