2014-03-25 19 views
2

NDK9应该使用android API19吗? (尽管它与API18一起发布)。android nkd和sdk兼容性问题(运行时链接器错误)

全文:

我使用kivy建立一个Android应用程序,蟒蛇换Android和buildozer。

错误与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作品汇编。 :)

+0

我的'android-ndk-r9d/platforms'包含导出'wait4'的'android-19/arch-arm/usr/lib/libc.so'。我不明白这个错误:当你在4.4.2模拟器或设备中加载你的应用程序时,你明白了吗? –

+0

@AlexCohn Android 4.2.2 - Simmtronics XPADMini –

+0

如果您想更好地理解问题,可以'adb pull/system/lib/libc。所以'从你的设备(或以其他方式得到它),并检查它是否导出'wait4'函数。它应该,但如果印度制造商错过了这个小功能,我不会感到惊讶。 –

回答

0

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

+1

afaik,缺少标题不应该是问题。 –

3

只是为了防止任何人绊倒这一点。我遇到了同样的问题,但是从头开始使用平台工具构建python,并使用NDK r10和r10b。

这是因为google在NDK平台android-19中删除了内联wait4()声明。最初的问题是,wait4()被暴露在头文件中,但没有在任何地方声明,所以如果你尝试在较老的NDK上使用wait4,你可能会崩溃(就像你现在这样做)。

因此,他们进去并将其添加到API 18的libc.so中,我相信,但libc.so随O/S一起发货,所以O/S大于18的设备不会有wait4,因此它们已修补它通过在NDK平台上通过android-18添加一个内联的wait4()方法,然后在android-19中把它拿出来。我还不完全确定为什么,似乎它可能更有意义, ,特别是因为它被认为是一个过时的功能。有人告诉我,如果我希望应用在API 18以前的设备上运行,我不应该针对android-19进行构建,但有人说,总是使用最新的NDK来匹配您的构建目标。这是一个问题的链接。

https://code.google.com/p/android/issues/detail?id=19854

在我的情况下,我走进了CPython的模块/ 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”,并且您添加的任何需要它的模块都会中断,此时处理该问题的新工程师将不得不重新发现所有这一切再次。

+0

好的答案和很好的分析。 – jww