gpt4 book ai didi

android - 如何使用 Android 的 NDK 来使用 mkfifo

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:31 39 4
gpt4 key购买 nike

最近我升级了 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 decleration:

extern int mkfifo(const char*, mode_t);

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

最佳答案

如果您针对 android-21 平台 header 进行构建,就会发生这种情况。将 jni/Application.mk 中的 APP_PLATFORM 设置为旧版本,以使用旧 header 构建,以确保您仅链接到早期可用的功能。

(在 android-21 之前,C 库的特性和头文件并没有真正的显着变化,所以对于普通的 C 库函数,如果你构建目标 android 并不重要-3android-20。)

这已被报告并且是故意的行为,参见例如https://code.google.com/p/android/issues/detail?id=73725 .

如果您不需要使用 android-21 的新功能,只需使用旧的 header 进行构建。 (如果您想尝试为以前不存在的 arm64-v8ax86_64 构建,那么您的目标平台版本并不重要; ndk-build 将使用较旧的目标构建 32 位部分,并使用支持它们的最旧目标构建 64 位部分。)

如果你想有条件地尝试使用 android-21 平台的新功能,如果在这样的平台上运行,你可能需要使用 dlopendlsym 以有条件地加载它,因此您还需要从新 header 中复制其他定义,以允许您使用旧平台 header 进行构建。

关于android - 如何使用 Android 的 NDK 来使用 mkfifo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091001/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com