我已经为Android构建了FFmpeg,并希望在类似的应用程序中使用它:
System.loadLibrary("avutil");
System.loadLibrary("swscale");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");
构建输出为lib*.so
,lib*.so.MAJOR
和lib*.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。
答案 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)'