12

我即将将一个大型 C++ 项目(某种库项目,它绝对不包含 GUI)移植到 Android。它实际上是一个 Visual C++ 项目,但将作为中间步骤移植到 Linux。我知道 Android 不是一个“完整的”Linux,也没有声称提供所有 POSIX 功能,但我也知道使用 NDK 在 Android 上有很多“POSIXish 功能”。

现在我的实际问题是:

与完整的 POSIX 集相比,哪些是 Android 上不可用的最大/最重要的功能?这样我在从 Visual C++ 移植到 Linux GCC 时可以牢记这一点。

我试图在谷歌上找到一些东西,但没有发现任何真正有用的东西,只是到处都有一些东西提到 Android 上有一些 POSIX 功能......

4

4 回答 4

4

仿生由谷歌重新编码。它很小,但针对 Android 进行了优化。

我知道它唯一缺少的就是pthread_cancel()功能。

我的经验是,如果你成功地将它移植到 GNU/Linux,而无需pthread_cancel()调用,那么你应该没问题。

顺便说一句,你想建立什么样的图书馆?它有什么用途?网络、线程...

PS:即使是 Linux 也不完全是 POSIX。

于 2012-08-29T13:46:15.443 回答
3

仿生维基百科页面

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

还有一些有趣的信息:

尽管仿生旨在实现所有 C11 和 POSIX,但 libc 中仍然(截至 Oreo)大约 70 个 POSIX 函数缺失[8]。还有一些 POSIX 函数,例如 endpwent/getpwent/setpwent 系列不适用于 Android,因为它缺少 passwd 数据库。从 Oreo 开始,libm 已经完成。

出于安全原因,某些函数故意不符合 POSIX 或 C 标准,例如 printf 不支持 %n 格式字符串。 [9]

树文档中的官方仿生引用

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

在 bionic/ 中运行 ./libc/tools/check-symbols-glibc.py 以获取由 glibc 但不是由 bionic 实现的 POSIX 函数的当前列表。目前(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 函数。

于 2018-05-04T13:17:59.107 回答
2

共享内存也是您可能会发现在 android 中以不同方式实现的东西。尝试在 android 内核上使用 shm_open 和 shm_unlink 时受到重创。Android 实现了异步共享内存(ashmem)。

于 2013-08-22T21:41:50.813 回答