首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Android的NDK使用mkfifo

如何通过Android的NDK使用mkfifo
EN

Stack Overflow用户
提问于 2014-11-24 00:03:14
回答 2查看 10.4K关注 0票数 9

最近我升级了NDK,现在我的应用程序崩溃了,缺少符号mkfifo

代码语言:javascript
复制
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中内联定义的

代码语言:javascript
复制
static __inline__ int mkfifo(const char *__p, mode_t __m) {
    return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
}

但在平台版本21中,它被更改为仅外部解密:

代码语言:javascript
复制
extern int mkfifo(const char*, mode_t);

所以这就解释了缺少符号的异常。我的问题是我该如何修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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-v8ax86_64,那么使用较旧的平台版本并不重要;ndk-build将使用较旧的目标构建32位部分,而使用支持它们的最旧目标构建64位部分。)

如果您想要有条件地使用android-21平台的新特性(如果在这样的平台上运行),您可能无论如何都需要使用dlopendlsym来有条件地加载它,因此您还需要从新的头文件中复制其他定义,以便使用旧的平台头文件进行构建。

票数 26
EN

Stack Overflow用户

发布于 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下正常工作的

  • Old/unmaintained应用程序现在可能无法在"L“下运行。这可能会影响甚至不使用网络的简单应用程序,处理不受信任的数据,或针对新的"L“SDK API。

  • 主动维护的针对"L“的应用程序必须附带PIE可执行文件或静态可执行文件。如果应用程序想要面向it或更低版本,它还必须提供非PIE可执行文件或静态可执行文件。在ICS和GB.

上,即使是一个用-fPIE -pie构建的简单的"Hello world“程序也会出现segfault

显然,您可能更喜欢使用前面的解决方案,但只是认为它值得注意。

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

https://stackoverflow.com/questions/27091001

复制
相关文章

相似问题

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