點擊播放視頻時拋出 java.lang.UnsatisfiedLinkError,靜態區塊載入 stlport_shared、hdcore、hdutil 等 .so 庫失敗。
專案結構需為:
src/main/jniLibs/
├── arm64-v8a/
│ ├── libstlport_shared.so
│ ├── libhdcore.so
│ └── ...
├── armeabi-v7a/
│ └── ...
├── x86/
│ └── ...
└── x86_64/
└── ...
android {
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
或將 .so 放入 src/main/jniLibs 並確保 Gradle 同步後在 APK 的 lib/<abi>/ 目錄下可見。
.so 之間有依賴關係(如 hdcore 依賴 stlport_shared),**必須先載入被依賴的庫**:
static {
System.loadLibrary("stlport_shared"); // 基礎庫最先
System.loadLibrary("hdcore");
System.loadLibrary("hdutil");
System.loadLibrary("hdsdl");
System.loadLibrary("hdjpeg");
System.loadLibrary("hdacodec");
System.loadLibrary("hdplayer");
native_init();
}
在 gradle.properties 加入:
android.useDeprecatedNdk=true
並確認 build.gradle 的 ndkVersion 與 .so 編譯環境一致。
android {
packagingOptions {
doNotStrip "*/lib*.so" // 保留符號表
jniLibs {
useLegacyPackaging = true // AGP 4.1+ 需此行防止 .so 被壓縮
}
}
}
.apk 改名為 .zip 解壓,查看 lib/arm64-v8a/ 等目錄是否包含所有 .so。// 在 Application 或首個 Activity 的 onCreate 最早處加入
static {
try {
System.loadLibrary("stlport_shared");
Log.d("SO_TEST", "stlport_shared loaded OK");
} catch (UnsatisfiedLinkError e) {
Log.e("SO_TEST", "load failed: " + e.getMessage());
}
}
優先檢查 jniLibs 架構完整性、Gradle 配置、載入順序。若仍失敗,用 logcat 擷取完整堆疊,確認缺少哪個具體 .so 或符號,再對應補齊。