android - java.lang.UnsatisfiedLinkError : dlopen failed: libavcodec-57. 所以有意外的 e_machine:40

标签 android arm shared-libraries

我正在尝试在 Android 应用程序中使用 FFmpeg 3.1.3。 'libavcodec-57.so' 在主 Activity 中加载,如下所示:

static {
    LogUtil.e("DEVICE ARCH", System.getProperty("os.arch"));

    System.loadLibrary("avutil-55");
    System.loadLibrary("avcodec-57");
}

logcat 给我:(时间不重要)

E/DEVICE ARCH: armv7l
D/dalvikvm: Trying to load lib /data/app-lib/<package_name>-1/libavutil-55.so 0x4d11fe10
D/houdini: [5955] Loading library(version: 4.1.1a_y.45536 RELEASE)... successfully.
D/dalvikvm: Added shared lib /data/app-lib/<package_name>-1/libavutil-55.so 0x4d11fe10
D/dalvikvm: No JNI_OnLoad found in /data/app-lib/<package_name>-1/libavutil-55.so 0x4d11fe10, skipping init
D/dalvikvm: Trying to load lib /data/app-lib/<package_name>-1/libavcodec-57.so 0x4d11fe10
D/houdini: [5955] Unsupported feature (ID:0x10600ccf).
D/houdini: [5955] Open Native Library /data/app-lib/<package_name>-1/libavcodec-57.so failed.
E/dalvikvm: Houdini dlopen("/data/app-lib/<package_name>-1/libavcodec-57.so") failed: Cannot load ARM library
W/dalvikvm: Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lapp/Activity/MainActivity;
W/dalvikvm: Class init failed in newInstance call (Lapp/Activity/MainActivity;)
D/AndroidRuntime: Shutting down VM
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x4c810160)
W/TDLog: UncaughtException in Thread main
    java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/<package_name>-1/libavcodec-57.so" has unexpected e_machine: 40
        at java.lang.Runtime.loadLibrary(Runtime.java:364)
        at java.lang.System.loadLibrary(System.java:526)
        at <package_name>.Activity.MainActivity.<clinit>(MainActivity.java:128)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1208)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2141)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
        at android.app.ActivityThread.access$800(ActivityThread.java:138)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:149)
        at android.app.ActivityThread.main(ActivityThread.java:5045)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
        at dalvik.system.NativeStart.main(Native Method)

它表示设备的架构是 ARMlibavcodec-57.so 加载失败,e_machine: 40 表明预期架构也是 ARM(请参阅 ELF header doc)。

此外,libavutil-55.solibavcodec-57.so 都位于同一目录中。

最佳答案

解决方案是通过 libavcodec-57.so 加载所有需要的库在加载之前。

执行readelf -d libavcodec-57.so | grep NEEDED将获得它需要的库:

0x00000001 (NEEDED)                     Shared library: [libswresample-2.so]
0x00000001 (NEEDED)                     Shared library: [libavutil-55.so]
0x00000001 (NEEDED)                     Shared library: [libx264-148.so]
0x00000001 (NEEDED)                     Shared library: [libfaac.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libz.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]

内置库除外libm , libzlibc ,所有需要的库都应该加载之前 libavcodec-57.so .所以 Java 代码变成这样:

static {
    System.loadLibrary("faac");
    System.loadLibrary("x264-148");
    System.loadLibrary("avutil-55");
    System.loadLibrary("swresample-2"); // need x264 and avutil
    System.loadLibrary("avcodec-57"); // need all of the above
}

关于android - java.lang.UnsatisfiedLinkError : dlopen failed: libavcodec-57. 所以有意外的 e_machine:40,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39764705/

相关文章:

android - 我的 Action_DOWN 和我的 Scrollview 之间的冲突

assembly - 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

math - 使用 NEON 对 ARM 汇编中的四字向量中的所有元素求和

c - 如何使共享库成为可执行文件

使用 main() 创建共享库

android - 应用程序在谷歌市场上不可用 Galaxy S4

android - 如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?

linux - elf 文件自以为小,其实很大!无法生成 .bin 和 .hex 文件

ruby - 从 Heroku Bamboo 迁移到 Cedar stack 时,一些本地库丢失了!如何解决?

java - Android set() 和 setExact() 警报以不正确的时间间隔触发