Linphone SDK与VLC Player在Flutter插件中的JNI库冲突问题
原因分析
Linphone SDK(5.2.110)和VLC的libvlc-all(3.6.0-eap9)都打包了libc++_shared.so,但两者编译时使用的NDK版本、C++标准库编译参数不一致,导致符号表不兼容。用pickFirst强制选择其中一个后,另一个库的代码调用到未包含的符号(比如__emutls_get_address)就会触发UnsatisfiedLinkError。
具体修复步骤
1. 统一C++标准库依赖,避免重复打包
在Android模块的build.gradle中,不要用pickFirst,改为排除重复库后手动引入统一版本的libc++_shared.so:
android { // ...其他配置 packagingOptions { exclude 'lib/**/libc++_shared.so' } dependencies { // 引入与Linphone编译NDK版本匹配的cxx-shared依赖 // 比如Linphone用NDK 25编译,就对应引入: implementation 'com.android.ndk.thirdparty:cxx-shared:25.2.9519653' } }
注意:需确认本地构建Linphone时使用的NDK版本,从构建日志或Linphone的构建配置中查找,保证引入的依赖版本完全匹配。
2. 对齐Linphone与VLC的编译环境参数
如果你是本地构建Linphone SDK,检查以下配置:
- 确保开启
-DENABLE_CXX_SHARED=ON(默认开启,但需确认) - 调整Linphone的NDK版本,与VLC 3.6.0-eap9使用的NDK版本对齐(通常为NDK 25及以上)
3. 控制依赖传递性
在Flutter插件的android/build.gradle中,禁止Linphone和VLC自动传递各自的C++标准库依赖:
dependencies { implementation('org.linphone:linphone-sdk-android:5.2.110') { exclude group: 'com.android.ndk.thirdparty', module: 'cxx-shared' } implementation('org.videolan.android:libvlc-all:3.6.0-eap9') { exclude group: 'com.android.ndk.thirdparty', module: 'cxx-shared' } }
4. 彻底清理缓存后重新编译
执行命令清理旧的构建残留,避免缓存干扰:
flutter clean cd android && ./gradlew clean cd .. && flutter build apk
验证方法
在Google Pixel 7(Android 14)上安装编译后的APK,确认:
- 应用正常启动,无
UnsatisfiedLinkError提示 - Linphone的FactoryImpl类可正常加载,核心功能初始化成功
- VLC播放器功能可正常运行
内容的提问来源于stack exchange,提问作者LiLies
相关产品推荐
相关产品推荐

