Android NDK 21d与Android 7兼容性问题:pjsip库崩溃求助
解决Android NDK 21d编译PJSIP在Android 7设备崩溃的问题
别担心,这个报错java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__sendto_chk"并不是NDK 21d不支持Android 7,而是编译时的安全选项导致的兼容性问题,我来给你拆解清楚:
问题根源
NDK 21及以上版本默认启用了_FORTIFY_SOURCE=2这个安全编译选项,它会把普通的系统调用(比如sendto)替换成带缓冲区溢出检查的版本(__sendto_chk)。但Android 7(API 24)及更低版本的系统libc库中并没有这些__xxx_chk符号,所以当APP在Android 7设备上加载编译好的libpjsua2.so时,就会因为找不到符号而崩溃。
两种可行的解决方案
方案1:调整编译选项,禁用或降低_FORTIFY_SOURCE等级
你可以在PJSIP的编译配置里修改这个选项:
- 打开
pjproject/build/config_site.h,添加一行:
这会直接禁用这个安全检查选项,避免生成#define PJ_HAS_FORTIFY_SOURCE 0__sendto_chk这类符号。 - 或者在编译脚本的C/C++FLAGS中添加参数:
等级1的-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1_FORTIFY_SOURCE不会引入这些高版本系统才有的chk符号,同时还能保留部分安全检查。
方案2:指定匹配Android 7的目标API等级编译
NDK 21d本身是支持Android 7的(它最低支持API 21),但如果你的编译配置里APP_PLATFORM设成了API 28或更高,NDK会默认使用高版本系统的符号集。你需要在Application.mk里明确指定:
APP_PLATFORM := android-24
这样编译出来的库会兼容Android 7及以上系统,不会用到只有高版本才有的符号。
总结
完全不需要降级NDK版本,只要调整上述编译配置中的任意一项,就能解决这个崩溃问题。
内容的提问来源于stack exchange,提问作者tomtom
相关产品推荐
相关产品推荐

