Intereting Posts

Поддерживается ли Android POSIX?

Поддерживается ли Android POSIX? Я знаю, что он использует kernel ​​Linux, но я не уверен, что это означает, что он совместим с POSIX, поскольку стандарт POSIX больше связан с функциями userland. Итак, совместима ли она?

Например, если я использую только функции ANSI и POSIX в своей программе на C, будет ли она компилироваться и запускаться на Android без каких-либо изменений кода?

GNU libc (glibc) слишком большой и сложный для мобильных телефонов, поэтому Android реализует собственную специальную версию libc, которая является Bionic libc, которая сама не полностью поддерживает POSIX, одна из самых недостающих функций в android Bionic libc – pthread_cancel() поэтому, если вы его не используете, ваш код, вероятно, будет хорошо.

А также как упомянутая обезьяна @code вы можете взглянуть на бионический исходный код . Вы можете найти дополнительную информацию здесь .

Android не полностью совместим с POSIX. Сначала я могу заметить библиотеку по умолчанию c. Как вы знаете, это называется glibc. Но у Android есть своя библиотека c – bionic. Вот несколько заметок.

Некоторые функции в POSIX Bionic и заголовки системных вызовов – это заглушки или обертки для поведения, характерного для Android, что приводит к непреднамеренному поведению в некоторых случаях.

Android использует Linux-kernel, поэтому вы можете сказать, что он совместим с POSIX. Но в целом Android не соответствует спецификациям Unix, таким как POSIX. Также вы можете прочитать что-то подобное

Bionic не включает обработку исключений C ++, возможно, поскольку Google не использует исключения C ++, а исключения Java доступны после запуска виртуальной машины Java

Bionic не включает стандартную библиотеку шаблонов, и разработчики должны включать ее вручную, если это необходимо

Отличная пользовательская assembly NDK – CrystaX NDK

Основные характеристики кристалла NDK:

Широкие символы. NDK Google не поддерживает широкие символы в C или C ++. С CrystaX NDK вы получаете полную поддержку стандартных символов. Вы можете легко переносить существующий код, который использует широкие символы / строки / streamи или писать новый код.

Самые последние инструментальные узлы The CrystaX NDK включает в себя самые последние версии компиляторов GCC и Clang, а также конюшни. Это позволяет разработчикам использовать новые языковые возможности (например, новые возможности C ++ 11). Все компиляторы построены с оптимизацией на высоком и низком уровне, что позволяет генерировать наиболее эффективный код для целевого оборудования.

Поддержка C ++ 11 Так как CrystaX NDK включает в себя самые последние версии GCC и Clang, он поддерживает множество новых функций C ++ 11, перечисленных в C ++ 0x / C ++ 11 Поддержка в GCC и C ++ 98 и C ++ 11 Поддержка в Clang. Кроме того, CrystaX NDK предлагает полностью работающие C ++ 11 classы std :: thread, std :: mutex, std :: chrono и т. Д. Эти classы недоступны в Google NDK из-за отсутствия функциональности в Android Bionic libc. Мы исследовали эту проблему и исправили ее, поэтому в CrystaX NDK вы можете просто использовать их и забыть о ifdefs.

Поддержка Objective-C Единственными языками, поддерживаемыми Google NDK, являются C и C ++. CrystaX NDK добавляет поддержку Objective-C в дополнение к C и C ++. На данный момент поддерживается только основной язык; работа над cocoaподобными библиотеками продолжается. Чтобы начать использовать Objective-C в вашем проекте, просто добавьте исходные файлы с расширением .m (Objective-C) или .mm (Objective-C ++) и укажите их в LOCAL_SRC_FILES в Android.mk.

Продолжение следует … Если вы не видите здесь какой-то большой возможности, не стесняйтесь обращаться к нам и просить об этом. Вы также можете использовать наш трекер ошибок / ошибок, чтобы сообщать об ошибках или запросах функций. И, конечно, вклады приветствуются!

Вы можете найти более подробную информацию о сайте Official CrystaX NDK

Официальная цитата Bionic в дереве

https://android.googlesource.com/platform/bionic/+/37ad9597839c70a7ec79578e5072df9c189fc830/docs/status.md

Запустите ./libc/tools/check-symbols-glibc.py в bionic / для текущего списка функций POSIX, реализованных glibc, но не с помощью bionic. В настоящее время (2017-10):

 aio_cancel aio_error aio_fsync aio_read aio_return aio_suspend aio_write lio_listio pthread_cancel pthread_mutex_consistent pthread_mutex_getprioceiling pthread_mutex_setprioceiling pthread_mutexattr_getprioceiling pthread_mutexattr_getprotocol pthread_mutexattr_getrobust pthread_mutexattr_setprioceiling pthread_mutexattr_setprotocol pthread_mutexattr_setrobust pthread_setcancelstate pthread_setcanceltype pthread_testcancel wordexp wordfree libm 

Текущие символы libm: https://android.googlesource.com/platform/bionic/+/master/libm/libm.map.txt

0 оставшихся отсутствующих функций POSIX libm.

Страница Bionic Wikipedia

https://en.wikipedia.org/wiki/Bionic_(software)#Differences_from_POSIX

Также есть интересная информация:

Хотя biionic нацелен на реализацию всех C11 и POSIX, все еще (как и Oreo) из 70 функций POSIX отсутствует [8] из libc. Существуют также функции POSIX, такие как семейство endpwent / getpwent / setpwent, которые неприменимы для Android, поскольку в нем отсутствует firebase database passwd. Что касается Oreo, libm завершен.

Некоторые функции преднамеренно не соответствуют стандартам POSIX или C по соображениям безопасности, таким как printf, который не поддерживает строку формата% n. [9]

Я знаю, что этот ответ устарел, но он добавит ответы выше.

Да, Android не совместим с POSIX, в основном из-за ограничений libc (Bionic). Однако, используя CrystaX NDK, вы можете не чувствовать эту разницу так сильно – просто потому, что использование технологии CrystaX NDK для Android станет намного более совместимой с POSIX. Мы внедрили многие части libc (багги или отсутствующие в Bionic) самостоятельно в libcrystax.so, kernel ​​CrystaX NDK, и сделали это без изменения типичного streamа разработки. Мы собираемся улучшить его дальше, поскольку libcrystax еще не поддерживает полный набор POSIX, но на данный момент он поддерживает многие вещи, такие как широкие символы и строку, полную поддержку локалей (специфический для локали вход и выход), полный математическая библиотека, включающая комплексные и типовые функции, полностью работающий бэкенд для стандартной библиотеки C ++ (доступны две реализации по вашему выбору – GNU libstdc ++ или LLVM libc ++), а также множество других исправлений и улучшений.

Просто, чтобы показать, как CrystaX NDK упрощает разработку для Android, мы включили Boost 1.57.0 в CrystaX NDK 10.1.0, который мы создали из его источников без каких-либо изменений – только потому, что в CrystaX NDK Boost остаются на вершине многих больше POSIX-совместимой базы, чем в NDK Google.