2

我已经为 Android 构建了 FFmpeg,并希望在这样的应用程序中使用它:

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

构建输出是lib*.so,lib*.so.MAJORlib*.so.MAJOR.MINOR.OTHER文件。共享对象内部是引用lib*.so.MAJOR,例如libswscale.so.2requires 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.so”加载所需的库“libavutil.so.52” (load_library[1091]:找不到库'libavutil.so.52')

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

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

4

2 回答 2

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

对于那些不理解替换的人(像我之前一样),请查看这个直接相关的答案

于 2013-01-26T09:28:59.300 回答
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)'
于 2014-01-10T06:55:57.243 回答