安卓 NDK 和 SDK 兼容性问题(运行时链接器错误)

2 投票
2 回答
708 浏览
提问于 2025-04-17 23:45

NDK9能不能和安卓API19一起用?(虽然它是和API18一起发布的。)

事情的经过是这样的:

我在用kivy、python-for-android和buildozer来制作一个安卓应用。

当我用NDK9(也就是9d)和API19编译时,出现了错误:

E/AndroidRuntime( 1773): java.lang.UnsatisfiedLinkError: 无法加载库:soinfo_relocate(linker.cpp:975): 找不到“wait4”这个符号,它在“libpython2.7.so”中被引用...

但是用NDK9(也就是9d)和API18编译就没问题。:)

2 个回答

0

Android的SDK更新得比NDK频繁。以前就发生过,如果你使用了一个太新的SDK,NDK可能就没有对应的.h文件了。不过我不确定这是否和你的问题有关系。

3

如果有人碰巧看到这个,我之前也遇到过同样的问题。我是用平台工具从头开始构建Python的,使用的是NDK r10和r10b。

问题出在谷歌在NDK平台的android-19版本中移除了一个叫做inline wait4()的声明。最开始的问题是,wait4()在头文件中是可以找到的,但并没有在任何地方声明,所以如果你在旧版NDK上尝试使用wait4,可能会导致崩溃(就像现在这样)。

所以他们在API 18的时候把它加到了libc.so里,但libc.so是和操作系统一起发布的,所以那些操作系统版本低于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”,你可以在配置脚本中把它去掉,但这样的话,任何需要它的模块就会出错,届时新的工程师在处理这个问题时就得重新发现这些事情。

撰写回答