最近我升级了NDK,现在我的应用程序崩溃了,缺少符号mkfifo
E/dalvikvm(2031): dlopen("/data/app-lib/...mylib.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "mkfifo" referenced by "mylib.so"...较早的平台mkfifo是在sys/stat.h中内联定义的
static __inline__ int mkfifo(const char *__p, mode_t __m) {
return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
}但在平台版本21中,它被更改为仅外部解密:
extern int mkfifo(const char*, mode_t);所以这就解释了缺少符号的异常。我的问题是我该如何修复它?
发布于 2014-11-24 03:15:53
如果您基于android-21平台标头进行构建,则会发生这种情况。将jni/Application.mk中的APP_PLATFORM设置为较旧的版本,以便使用旧的头文件进行构建,以确保您只链接到以前可用的函数。
(在android-21之前,C库的特性和头文件并没有明显的变化,所以对于普通的C库函数,无论您是针对android-3还是针对android-20进行构建都无关紧要。)
据报道,这是有意为之的行为,见https://code.google.com/p/android/issues/detail?id=73725。
如果不需要使用android-21的新特性,只需使用旧的头文件构建即可。(如果您想尝试构建以前不存在的arm64-v8a或x86_64,那么使用较旧的平台版本并不重要;ndk-build将使用较旧的目标构建32位部分,而使用支持它们的最旧目标构建64位部分。)
如果您想要有条件地使用android-21平台的新特性(如果在这样的平台上运行),您可能无论如何都需要使用dlopen和dlsym来有条件地加载它,因此您还需要从新的头文件中复制其他定义,以便使用旧的平台头文件进行构建。
发布于 2014-12-12 22:47:14
我试过mstorsjo的修复方法,它似乎起作用了,但我有点担心,从他发布的链接来看,谷歌似乎并不真的认为这是一个好主意。因此,我做了更多的挖掘,似乎“合适的”解决方案是发布多个APK,其中(至少)一个针对android-20及更低版本,另一个针对android-21及更高版本。
这个问题源于NDK中的一项更改,即在执行NDK构建时强制使用'fPIE‘选项。从NDK 10d release notes
从21级开始,
引入了在构建时使用-fPIE -pie的要求。在API级别16和更高级别中,ndk-build在构建时使用PIE。此更改具有许多含义,在开发人员预览问题888中进行了讨论。这些含义不适用于共享库。
如果您查看Developer Preview Issue 888,它会显示以下内容:
仿生提交76e289c026f及其前身2aebf5429bb要求使用-fPIE -pie构建所有动态链接的本机可执行文件。这有许多可能意想不到的副作用,包括:
在KitKat下正常工作的
上,即使是一个用-fPIE -pie构建的简单的"Hello world“程序也会出现segfault
显然,您可能更喜欢使用前面的解决方案,但只是认为它值得注意。
https://stackoverflow.com/questions/27091001
复制相似问题