本机库.so.XY无法在运行时链接

时间:2013-01-25 12:12:49

标签: 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:无法加载库: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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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)'