我已经为 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: 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/