更新,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的 undefined reference 。但是,我对进一步的故障排除几乎一无所知。

在此先感谢您的帮助/建议!

最佳答案

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

但是,看起来int getpagesize()的方法签名在整个NDK版本或API级别上都没有改变,因此您应该能够通过以下位置的__page_size替换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提交错误报告。

10-05 21:47