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

时间:2016-03-15 04:41:48

标签: android c++ audio sdk android-ndk

更新2016年3月19日: Superpowered发布了可与NDK r11配合使用的新二进制文件

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

Error:error: undefined reference to '__page_size'

我尝试用不同的工具链构建,删除/添加几个构建标志,但到目前为止没有运气。

在使用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的未定义引用。但是我对进一步的故障排除知之甚少。

非常感谢您的任何帮助/建议!

2 个答案:

答案 0 :(得分:12)

NDK commit所做的更改似乎可以解释您所看到的问题。根据提交说明,对于Android API级别12及以下,__page_size已替换为PAGE_SIZE。当您使用API​​级别9和直接引用__page_size的代码时,您会看到此更改产生的影响。

但是,看起来int getpagesize()的方法签名在NDK版本或API级别之间没有变化,因此您应该可以通过替换__page_size的使用来解决此错误getpagesize()位于以下位置:

SuperpoweredSource /解码器/ SuperpoweredDecoder.cpp:120 SuperpoweredSource /解码器/ hlsreader.cpp:582

<强>更新 要修改它而不修改Superpowered源代码,您需要定义符号__page_size。要做到这一点,你可以构建一个只包含

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

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

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

答案 1 :(得分:5)

因此,作为情况的解决方法,我将NDK还原为r10e,这有效。将在Superpowered库获得修复之前使用它。非常感谢@bullsy