You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中添加参数:
    -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
    
    等级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:47:32