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

调用System.loadLibrary加载libmpv.so失败,报UnsatisfiedLinkError求助

Android集成MPV播放器遇UnsatisfiedLinkError问题解决

问题描述

在Android项目中集成MPV播放器,已拥有libmpv.so文件,通过MPVLib类的静态代码块调用System.loadLibrary加载"mpv"和"player"库,但运行时抛出java.lang.UnsatisfiedLinkError,提示找不到liblibmpv.so.so库。

代码片段

public class MPVLib {
     static {
        String[] libs = { "mpv", "player" };
        for (String lib: libs) {
            System.loadLibrary(lib);
        }
     }
}

错误堆栈

FATAL EXCEPTION: main   Process: videoplayer.movies.videoeditor.hd, PID: 25984
java.lang.UnsatisfiedLinkError: dlopen failed: library "liblibmpv.so.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1082)
at java.lang.Runtime.loadLibrary0(Runtime.java:1003)
at java.lang.System.loadLibrary(System.java:1661)
at videoplayer.movies.videoeditor.hd.mpv.MPVLib.<clinit>(MPVLib.java:18)
at videoplayer.movies.videoeditor.hd.mpv.MPVView.removeObserver(MPVView.kt:220)
at videoplayer.movies.videoeditor.hd.mpv.MPVActivity.onDestroy(MPVActivity.kt:735)
 at android.app.Activity.performDestroy(Activity.java:9049)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1510)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5971)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6022)
    at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:47)
    at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:185)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2643)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:257)
    at android.os.Looper.loop(Looper.java:368)

Gradle配置

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-android")
    id("kotlin-kapt")
    id("com.google.gms.google-services")
}

// Define abiCodes and universalBase as top-level variables

android {
    namespace = "videoplayer.movies.videoeditor.hd"
    compileSdk = 34
    ndkVersion = "27.1.12297006"
    defaultConfig {
        applicationId = "videoplayer.movies.videoeditor.hd"
        minSdk = 24
        targetSdk = 34
        versionCode = 10
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

        ndk {
            // Specify the architectures you want to support
            abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64"))
        }
    }

    bundle {
        language {
            enableSplit = false
        }
    }
}

JNI库结构

JNI库结构截图


问题原因及解决步骤

原因分析

错误提示寻找liblibmpv.so.so,说明动态链接器拼接库名时出现重复前缀和后缀。核心问题是player库编译时依赖mpv的方式错误,硬编码了libmpv.so而非mpv,导致链接器尝试加载不存在的重复命名文件。

解决步骤

  1. 检查player库的依赖配置
    若自行编译player库,查看CMakeLists.txt/Android.mk文件,确认链接mpv的语句正确。例如CMake中应使用:

    target_link_libraries(player PRIVATE mpv)
    

    而非直接写libmpv.so。

  2. 验证JNI库文件名与路径
    确保每个ABI目录下都存在libmpv.so和libplayer.so,文件名无错误(如不要写成liblibmpv.so),且存放路径src/main/jniLibs符合Android默认规范。

  3. 调整库加载方式(验证用)
    可尝试直接指定绝对路径加载库,确认文件是否可被正确找到:

    static {
        try {
            String libDir = MPVLib.class.getResource("/").getPath().split("!")[0] + "/lib/";
            System.load(libDir + System.mapLibraryName("mpv"));
            System.load(libDir + System.mapLibraryName("player"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    验证通过后,优先换回System.loadLibrary方式。

  4. 补充Gradle配置(若需)
    若JNI库路径非默认,需在android块中明确指定:

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
    

内容的提问来源于stack exchange,提问作者Sajawal Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:16