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 (即9d)和API18进行编译。:)
发布于 2014-10-14 11:19:11
以防有人偶然发现这个。我也遇到过同样的问题,但是使用平台工具、NDK r10和r10b从头开始构建python。
这是因为谷歌删除了NDK platform android-19中的内联wait4()声明。最初的问题是,wait4()在头文件中公开,但没有在任何地方声明,所以如果您尝试在较旧的NDK上使用wait4,您可能会崩溃(就像现在一样)。
所以他们加入并把它添加到API18的libc.so中,我相信,但是libc.so是随操作系统一起发布的,所以操作系统早于18的设备就不会有wait4,所以他们在NDK平台上通过android-18添加了一个内联的wait4()方法来修补它,然后在android-19中将其删除。我还不完全确定为什么,看起来在这一点上不去管它可能更有意义,特别是因为它被认为是一个过时的函数。有人告诉我,如果我想让应用程序在比API 18更老的设备上运行,就不应该使用android-19构建,但其他人说总是使用最新的NDK来匹配您的构建目标。这里有一个指向问题的链接。
https://code.google.com/p/android/issues/detail?id=19854
在我的例子中,我进入了cpython Modules/posixmodule.c xmodule.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/PosixMode.c文件,并将wait4调用替换为waitpid。缺点是您会丢失返回的资源使用信息,而waitpid不提供该信息,因此,如果您的模块需要该信息,则必须添加一些内容来单独检索该pid的资源使用情况。
或者,如果您从来不打算使用"wait4“,则可以从配置脚本中删除它,并且您添加的任何需要它的模块都将崩溃,此时处理该问题的新工程师将不得不重新发现所有这些问题。
发布于 2014-03-26 03:04:15
Android SDK发布的频率比NDK更高。不止一次,如果你使用一个太新的SDK,NDK将不会有它的.h。现在我不确定这会不会和你的问题有关。
https://stackoverflow.com/questions/22624987
复制相似问题