首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android nkd和sdk兼容性问题(运行时链接器错误)

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

Stack Overflow用户
提问于 2014-03-25 11:35:50
回答 2查看 674关注 0票数 2

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进行编译。:)

EN

回答 2

Stack Overflow用户

发布于 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文件,并添加了:

代码语言:javascript
复制
#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“,则可以从配置脚本中删除它,并且您添加的任何需要它的模块都将崩溃,此时处理该问题的新工程师将不得不重新发现所有这些问题。

票数 3
EN

Stack Overflow用户

发布于 2014-03-26 03:04:15

Android SDK发布的频率比NDK更高。不止一次,如果你使用一个太新的SDK,NDK将不会有它的.h。现在我不确定这会不会和你的问题有关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22624987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档