android - native 库 .so.XY 无法在运行时链接

标签 android shared-libraries native

我已经为 Android 构建了 FFmpeg,并希望在应用程序中使用它,如下所示:

System.loadLibrary("avutil");
System.loadLibrary("swscale");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");

构建输出为 lib*.solib*.so.MAJORlib*.so.MAJOR.MINOR.OTHER文件。共享对象内部是诸如 lib*.so.MAJOR 之类的引用,例如 libswscale.so.2 需要 libavutil.so.52

现在,如果我将 *.so 文件放入项目的 libs 文件夹中(更准确地说是 libs/armeabi-v7a),我的当然得到

01-25 12:06:40.270: E/AndroidRuntime(2905): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]: 107 could not load needed library 'libavutil.so.52' for 'libswscale.so' (load_library[1091]: Library 'libavutil.so.52' not found)

但是,如果我将 *.so.MAJOR 文件放入 libs 文件夹中来解决链接异常,则从 Eclipse 运行应用程序时会出现相同的错误。我注意到,如果我创建 APK,这些文件甚至不会导出! 那么我如何告诉 Eclipse 将 *.so.MAJOR 文件打包为库? 或者,如何以相互引用的方式编译共享对象通过 *.so 而不是 *.so.MAJOR

编辑:似乎无法打包 *.so.XYZ 文件 automatically .

最佳答案

没有找到按照我的意愿获取.so.MAJOR文件的解决方案。在我看来,Android 构建系统仅自动复制 *.so 文件,并且不允许其他文件扩展名。
因此,我重写了 FFmpeg makefile,让共享对象通过 libXXX.so 相互引用。

library.mak中,我替换了以下配方中的$(SHFLAGS)

$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
    $(SLIB_CREATE_DEF_CMD)
    $$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
    $(SLIB_EXTRA_CMD)

第三行看起来像

$(subst $$(@F),$(SLIBNAME),$(SHFLAGS))

对于那些不理解替换的人(就像我之前一样),请检查 this directly related answer .

关于android - native 库 .so.XY 无法在运行时链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14521588/

相关文章:

java - 如何在 Android 上制作一个显示退格 (⌫) 字符的按钮?

linux - 如何在 Linux 上确定共享库依赖路径?

c - 对于特定于共享库的 1GB 使用 malloc 是正确的做法吗?

java - 如何通过 COM/native DLL 公开 Java?

android - Phonegap 中的原生 Android 菜单。无法让我的代码工作

android - 检测屏幕打开或解锁,Android

添加到 ArrayList 的 Java 对象未显示

android-animation - 如何改变旋转轴

linux - 有没有一种自动的方法来找出共享对象依赖关系?

Android 4.3 : Native crash in unkown. 未知