2017-07-02 52 views
0

我面對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?

回答

2

如果你想使用NDK R15

  1. 您可以強制NDK_MIN_PLATFORM_LEVEL=9(上NDK,建立命令行),以避免該警告。但NDK沒有android-10r15您應該在命令行上明確選擇APP_PLATFORM=android-9。 FWIW,除非項目的其他部分不兼容,否則您可以使用android-14

  2. 您應該設置APP_DEPRECATED_HEADERS=true,那麼標題將與r14完全相同,您將避免統一標題中的錯誤。

有可能是在R15統一的頭一個bug,他們只設置TCSANOWTCSETSMIPS,但不支持其他的ABI。

已被廢棄的頭平臺/ Android的14 /弓臂/ usr/include目錄will be removedR16今年晚些時候,或者,如果在最壞的情況下,在R17。與兼容的庫也可能會消失。

+1

可以提供在哪裏設置APP_DEPRECATED_HEADERS = true的例子,我不是那麼熟悉,只是知道該怎麼辦好NDK構建和打造LIB – djdance

+2

如果你有Application.mk,你可以把它放在那裏。或者在ndk-build命令行上。 –

0

如果您使用CMake,您應該將此代碼添加到您的模塊build.gradle

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

我只是在終端中運行ndk-build。最糟糕的是,沒有gradle(舊項目)。你不知道在這種情況下做什麼?謝謝 – djdance