调用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库结构

问题原因及解决步骤
原因分析
错误提示寻找liblibmpv.so.so,说明动态链接器拼接库名时出现重复前缀和后缀。核心问题是player库编译时依赖mpv的方式错误,硬编码了libmpv.so而非mpv,导致链接器尝试加载不存在的重复命名文件。
解决步骤
检查player库的依赖配置
若自行编译player库,查看CMakeLists.txt/Android.mk文件,确认链接mpv的语句正确。例如CMake中应使用:target_link_libraries(player PRIVATE mpv)而非直接写
libmpv.so。验证JNI库文件名与路径
确保每个ABI目录下都存在libmpv.so和libplayer.so,文件名无错误(如不要写成liblibmpv.so),且存放路径src/main/jniLibs符合Android默认规范。调整库加载方式(验证用)
可尝试直接指定绝对路径加载库,确认文件是否可被正确找到: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方式。补充Gradle配置(若需)
若JNI库路径非默认,需在android块中明确指定:sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } }
内容的提问来源于stack exchange,提问作者Sajawal Hussain
相关产品推荐
相关产品推荐

