在把eclipse工程迁移到Android Studio过程中,JNI部分出现了一些问题,逐步解决之后遇到了 使用ndkr17版本时,在AndroidStudio进行构建,在连接过程中报错:page_size未定义
[armeabi-v7a] Compile++ thumb: agent <= MUpgradeDataStore.cpp
[armeabi-v7a] Compile++ thumb: agent <= MUpgradeMgr.cpp
[armeabi-v7a] SharedLibrary : libagent.so
jni/../../ElfHook3/ElfModule.cpp:334: error: undefined reference to '__page_size'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
但是在终端中,将目录选定到jni目录,运行ndk-build 就可以生成so库。想问一下这两者的区别和造成这种情况的原因
用的cmake还是android.mk?
解决方法
在这个 NDK commit中所做的更改似乎可以解释您所看到的问题.根据提交描述,__page_size被替换为PAGE_SIZE,用于AndroID API级别12及以下.当您使用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提交错误报告.