2013-01-25 67 views
1

鏈接我已經建立了FFmpeg的Android和想使用它在應用程序中,像這樣:本地庫.so.XY沒有在運行時

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

回答

1

沒有找到解決方案,以我想要的.so.MAJOR文件。在我看來,Android構建系統僅自動複製*.so文件,並且不允許其他文件擴展名。
因此,我重寫了FFmpeg makefiles以使共享對象相互引用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

其實,你不需要那樣做。 你需要做的是編輯配置文件。 並找出這樣的:

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)' 
相關問題