NDK 15打破串口库

时间:2017-07-02 11:56:55

标签: android android-ndk serial-port rs485

我遇到过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中避免它吗?

2 个答案:

答案 0 :(得分:2)

如果您想使用NDK r15

  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 完全相同,您将避免统一标题中的错误。

  3. 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"
            }
        }