我要将一个大型C ++项目(某种类型的Library Project,它完全没有GUI)移植到Android上。它实际上是一个Visual C ++项目,但它将作为中间步骤移植到Linux。我知道Android不是一个“完整的”Linux并且不声称提供所有POSIX功能,但我也知道在Android上使用NDK有很多“POSIXish功能”。
现在我的实际问题是:
与完整的POSIX套装相比,哪些是Android上最不重要/最重要的功能?因此,在从Visual C ++移植到Linux GCC时,我可以牢记这一点。
我试图在谷歌上找到一些东西,但没有发现真正有用的东西,只是在这里和那里提到一些东西提到Android上有一些POSIX功能......
答案 0 :(得分:3)
Google的重新编码。它很小但是针对Android进行了优化。
我所知道的唯一重要的缺点是pthread_cancel()
函数。
我的经验是,如果您将其成功移植到GNU / Linux,而没有pthread_cancel()
次调用,那么您应该大部分都可以。
PS:即使Linux也不完全是POSIX。
答案 1 :(得分:2)
共享内存也是你在android中可能会发现的不同内容。在尝试使用Android内核上的shm_open和shm_unlink时遭遇重创。 Android实现了异步共享内存(ashmem)。
答案 2 :(得分:2)
仿生维基百科页面
https://en.wikipedia.org/wiki/Bionic_(software)#Differences_from_POSIX
还有一些有趣的信息:
尽管bionic的目标是实现所有C11和POSIX,但仍有(从Oreo开始)大约有70个POSIX函数从libc中丢失[8]。还有一些POSIX函数,例如endpwent / getpwent / setpwent系列,它们不适用于Android,因为它缺少passwd数据库。从奥利奥开始,libm已经完成。
出于安全原因,某些功能故意不符合POSIX或C标准,例如printf不支持%n格式字符串。[9]
树形文档中的Bionic官方报价
运行./libc/tools/check-symbols-glibc.py in bionic /获取glibc实现的POSIX函数的当前列表,但不是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函数。
答案 3 :(得分:1)
缺少的最明显的功能是pthread_cancel()
。
此博客有一些其他详细信息:http://codingrelic.geekhold.com/2008/11/six-million-dollar-libc.html