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

Linphone SDK与VLC Player在Flutter插件中的JNI库冲突问题

解决方案:Linphone与VLC libc++_shared.so冲突及UnsatisfiedLinkError修复

原因分析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:44:59