【问题标题】:Native libraries .so.XY failing to link at runtime本机库 .so.XY 在运行时无法链接
【发布时间】:2013-01-25 12:12:49
【问题描述】:

我已经为 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:无法加载库:link_image[1936]:107 无法为“libswscale”加载所需的库“libavutil.so.52” .so' (load_library[1091]: 找不到库 'libavutil.so.52')

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

编辑:似乎没有办法打包*.so.XYZ 文件automatically

【问题讨论】:

    标签: android shared-libraries native


    【解决方案1】:

    没有找到如我所愿获取.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

    【讨论】:

      【解决方案2】:

      实际上,您不需要这样做。 您需要做的是编辑配置文件。 并找出这个:

      SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
      LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
      SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
      SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
      

      将它们修改为:

      SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
      LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
      SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
      SLIB_INSTALL_LINKS='$(SLIBNAME)'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多