android - 使用cmake集成FFMPEG : dlopen failed: library "libavutil.so.56" not found

标签 android ffmpeg cmake android-ndk linker

此问题是此 other question of mine 之后的后续线程.

最终成功使用 gradle 和 cmake 构建 apk 文件以将 FFMPEG 集成到 Android 项目中后,我遇到了一个新的异常,该异常在调用 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")
    }
...
}

我尝试将 .so 文件移动到 PROJECT/app/jniLibs 中,然后将以下行添加到 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


---编辑---

And after manually loading the libraries using System.loadLibrary I encountered a new error which indicates that libavutil has text relocations and it seems that for API-23 and above it is not permitted.

也许您应该尝试使用选项 --disable-asm-fPIC 构建 ffmpeg,以获得无需文本重定位的二进制文件。看到这里https://stackoverflow.com/a/39965908/8034839 ,但 NEON 看起来仍然存在一些问题。

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

关于android - 使用cmake集成FFMPEG : dlopen failed: library "libavutil.so.56" not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419416/

相关文章:

java - 在java项目中使用cmake时出现"package xxx.util does not exist"错误

java - 添加到listView的顶部

android - 如何在选择器的可绘制对象中应用色调?

Android 4.0.3 模拟器崩溃 : Failed to allocate memory: 8

parsing - 如何使用 ffmpeg 从视频中提取音频?

无法使用 CMAKE 构建 Makefile,未指定编译器

c++ - ITK 不使用 VS 2010 构建

android - 如何下载受 NTLM 身份验证保护的文件

ffmpeg: `select` 过滤器输出帧数关闭

ffmpeg - 如何制作在第一段中间开始播放的 MPEG-DASH MPD?