在最近的 NDK 更新后,ndk-build 无法构建 Superpowered 音频库

ndk-build fails to build Superpowered audio library after recent NDK update

2016 年 3 月 19 日更新: Superpowered 发布了可与 NDK r11 正常工作的新二进制文件

我正在尝试在 Android Studio 中构建 Superpowered 库 CrossExample 示例项目。直到最近的 NDK 更新,它才像魅力一样工作,但现在执行 ndk-build 会出现错误:

Error:error: undefined reference to '__page_size'

我尝试使用不同的工具链构建,removing/adding 几个构建标志到目前为止都没有成功。

在另一个使用 Superpowered SDK 和几乎相同配置的项目中,我得到了一些其他错误详细信息。部分输出消息日志:

/android/ndk/platforms/android-9/arch-x86/usr/include/unistd.h:173: error: undefined reference to '__page_size'
/android/ndk/platforms/android-9/arch-x86/usr/include/unistd.h:173: error: undefined reference to '__page_size'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/user_name/StudioProjects/project_name/app/src/main/jniSuperpowered/obj/local/x86/libNativeLibName.so] Error 1
make: *** Waiting for unfinished jobs....
/Volumes/iMect/iphone/SuperpoweredSource/decoder/SuperpoweredDecoder.cpp:120: error: undefined reference to '__page_size'
/Volumes/iMect/iphone/SuperpoweredSource/decoder/hlsreader.cpp:582: error: undefined reference to '__page_size'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/user_name/StudioProjects/project_name/app/src/main/jniSuperpowered/obj/local/armeabi-v7a/libNightcorizerSuperpowered.so] Error 1
FAILURE: Build failed with an exception.

看起来不对的地方是 unistd.h 中对 __page_size 的未定义引用。但是,我对进一步的故障排除知之甚少。

在此先感谢您的任何 help/suggestions!

NDK commit 中所做的更改似乎可以解释您遇到的问题。根据提交描述,__page_sizePAGE_SIZE 替换为 Android API 级别 12 及以下。当您使用 API 级别 9 和直接引用 __page_size 的代码时,您会看到此更改的效果。

但是,int getpagesize() 的方法签名似乎在 NDK 版本或 API 级别之间没有改变,因此您应该能够通过替换 [= 的用法来解决此错误=11=] 和 getpagesize() 在以下位置:

SuperpoweredSource/decoder/SuperpoweredDecoder.cpp:120 SuperpoweredSource/decoder/hlsreader.cpp:582

更新: 要在不修改 Superpowered 源代码的情况下修复它,您需要定义符号 __page_size。为此,您可以构建一个仅包含

的小型虚拟库
#include <unistd.h>
extern unsigned int __page_size = getpagesize();

然后,将此库的模块添加到您的 Android.mk(或者您的 build.gradle,如果您使用的是新的实验系统)并使 Superpowered 的模块依赖于虚拟模块。

或者,您可以使用 Superpowered 提交错误报告。

因此,作为这种情况的解决方法,我将 NDK 恢复为 r10e,这很有效。将使用它直到 Superpowered 库得到修复。非常感谢@bullsy