ndk9是否应该与android api19一起工作?(尽管是在API18发布的)。
完整故事:
我正在使用kivy、python for android和buildozer构建一个android应用程序。
使用MDK9(IE 9D)和API19编译会导致错误:E/AndroidRuntime( 1773): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "wait4" referenced by "libpython2.7.so"...
使用ndk9(ie 9d)和api18工程编译。:)
最佳答案
以防有人偶然发现。我也遇到过同样的问题,但是使用平台工具从头开始构建python,使用ndk r10和r10b。
这是因为谷歌删除了ndk平台android-19中的内联wait4()声明。最初的问题是wait4()在头文件中公开,但在任何地方都没有声明,因此如果尝试在旧的ndk上使用wait4,可能会崩溃(就像现在一样)。
所以他们把它添加到了libc.s o中,我相信是在api 18中,但是libc.so是随o/s一起提供的,所以o/s大于18的设备不会有wait4,所以他们通过android-18在ndk平台中添加了一个内联的wait4()方法来修补它,然后在android-19中取出它,我不完全确定为什么,看起来这可能更有意义。在那一点上不要管它,特别是因为它被认为是一个过时的函数。有人告诉我,如果我希望应用程序运行在api 18之前的设备上,就不应该针对android-19进行构建,但其他人说,总是使用最新的ndk来匹配构建目标。这里有一个问题的链接。
https://code.google.com/p/android/issues/detail?id=19854
在我的例子中,我进入cpython modules/posixmodule.c文件,并添加:
#if defined(__ANDROID__)
#undef HAVE_WAIT4
#endif
在我的例子中,这很好,因为没有一个python模块使用wait4。实际上,Linux认为wait4命令已经过时(http://linux.die.net/man/2/wait4)。你应该改用waitpid。
因此,即使您下载了一些使用wait4的第三方python模块,也有两个选项。1)将该模块更改为使用waitpid,或2)更新“ifdef have_wait4”部分中的modules/posixmodule.c文件,并将wait4调用替换为waitpid。缺点是您丢失了返回的资源使用信息,waitpid没有提供这些信息,因此如果您的模块需要这些信息,则必须添加一些内容来分别检索该pid的资源使用情况。
或者,如果您从未计划使用“wait4”,则可以从配置脚本中删除它,并且添加的任何需要它的模块都将中断,此时处理该问题的新工程师将不得不重新发现所有这些内容。