Android集成Zoom SDK遇JNI UnsatisfiedLinkError及空指针问题
问题根源
你遇到的__emutls_get_address符号找不到错误,本质是pickFirst仅强制选择了其中一个libc++_shared.so,但pjsua2和Zoom SDK依赖的libc版本不一致——不同NDK版本编译的libc符号表存在差异,导致后续调用Zoom SDK的JNI方法时找不到对应版本的符号。而SharedPreferences空指针是JNI异常引发的连锁反应,并非核心问题。
解决方案
核心思路是让两个库使用完全相同版本的libc++_shared.so,避免版本不兼容导致的符号缺失。具体步骤如下:
- 确定Zoom SDK使用的NDK版本:查看Zoom SDK的
build.gradle配置,或者解压其aar包,从AndroidManifest.xml或编译信息中找到对应的NDK版本(比如r21e、r25b等)。 - 重新编译pjsua2:
- 下载对应版本的NDK,配置到pjsua2的编译环境中。
- 编译pjsua2时,指定使用
c++_shared作为C++运行时(pjsip的编译脚本中可通过--use-ndk-cxx或类似参数配置,具体参考pjsip编译说明)。 - 编译完成后,将生成的
libc++_shared.so替换项目中pjsua2模块下的对应文件。
- 移除
packagingOptions中的pickFirst配置:现在两个库依赖的libc++_shared版本一致,不会再出现重复文件冲突。
额外注意
解决JNI符号问题后,SharedPreferences空指针异常大概率会自动消失。如果仍存在,检查JoinByURLActivity中SharedPreferences的初始化逻辑,确保在Zoom SDK初始化完成后再进行相关操作,并且添加空值判断避免NPE。
内容的提问来源于stack exchange,提问作者dj_4war
相关产品推荐
相关产品推荐

