android ndk和sdk兼容性问题(运行时链接器错误)

时间:2014-03-25 03:35:50

标签: android python android-ndk kivy

NDK9应该和Android API19一起工作吗? (虽然它是随API18发布的)。

全文:

我正在使用kivy,python-for-android和buildozer构建Android应用程序。

使用MDK9(即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进行编译。 :)

2 个答案:

答案 0 :(得分:3)

以防万一有人偶然发现这一点。我遇到了同样的问题,但是使用平台工具和NDK r10和r10b从头开始构建python。

这是因为谷歌删除了NDK平台android-19中的内联wait4()声明。最初的问题是wait4()在标题中公开但没有在任何地方声明,所以如果你试图在较旧的NDK上使用wait4,你可能会崩溃(就像你现在一样)。

所以他们进入并将其添加到API 18中的libc.so我相信,但是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模块,你也有2个选择。 1)将该模块更改为使用waitpid,或者2)更新" ifdef HAVE_WAIT4"中的Modules / posixmodule.c文件。部分,并用waitpid替换wait4调用。缺点是你丢失了返回的资源使用信息,waitpid没有提供,所以如果你的模块需要,你必须添加一些内容来分别检索该pid的资源使用情况。

或者,您可以删除" wait4"如果您从未计划使用它,请从您的配置脚本中删除,并且您添加的任何需要它的模块都会中断,此时处理该问题的新工程师将不得不重新发现所有这些。

答案 1 :(得分:0)

Android SDK比NDK更频繁地发布。它不止一次发生,如果你使用过时的SDK,NDK将不会有.h。现在我不确定这与你的问题有关。