使用 cmake 集成 FFMPEG:dlopen 失败:找不到库"libavutil.so.56"



这个问题是我的另一个问题之后的后续问题。

在最终成功地使用gradle和cmake将FFMPEG集成到Android项目中构建了apk文件之后,我面临着一个新的异常,该异常在调用System.loadLibrary时抛出。

java.lang.UnsatisfiedLinkError: dlopen failed: library "libavutil.so.56" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
at com.hmomeni.canto.activities.EditActivity.<init>(EditActivity.kt:26)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

这是导致错误的代码部分:

class EditActivity : AppCompatActivity(), View.OnClickListener {
init {
System.loadLibrary("Canto")
}
...
}

我尝试在PROJECT/app/jniLibs中移动.so文件,然后在build.gradle文件中添加以下行,但没有成功。

sourceSets.main.jniLibs.srcDirs = ['./jniLibs/']

如果您将jniLibs.srcDirs配置如下:

sourceSets.main.jniLibs.srcDirs = ['./jniLibs/']

然后,您的路径app/jniLibs/ffmpeg/{ANDROID_ABI}/lib不正确,您的.so文件将不会被您的构建系统找到和打包。

尝试使jniLibs结构如下:

jniLibs
│   ├── x86
│   ├── x86_64
│   ├── arm64-v8a
│   ├── armeabi-v7a

不要在{ANDROID_ABI}/后面添加lib


---编辑---

在使用System.loadLibrary手动加载库后,我遇到了一个新错误,该错误表明libavutil有文本重定位,对于API-23及更高版本,这似乎是不允许的。

也许您应该尝试使用选项--disable-asm-fPIC构建ffmpeg,以获得一个没有文本重定位的二进制文件。请参阅此处https://stackoverflow.com/a/39965908/8034839,但看起来近地天体仍然存在一些问题。

另一个供您参考的讨论:https://stackoverflow.com/a/50207091/8034839

相关内容

最新更新