2013-05-22 35 views
2

这是一个与视频处理相关的Android应用程序。 使用的库是ffmpeg + x264,并根据ffmpeg_vitamio工作松散编译为什么它抱怨找不到一个图书馆,即使我已经包含它?

编译的ffmpeg的好,libffmpeg.so根据下面创建:

$CC -lx264 -lm -lz -shared --sysroot=$SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $EXTRA_LDFLAGS libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o libavformat/*.o libswresample/*.o libswresample/arm/*.o libswscale/*.o -o $PREFIX/libffmpeg.so 

这里libx264被列入为共享库,从libx264.so.130更名为

然后我把libffmpeg.so放在我的Android项目中。 编译很好。但是运行的时候,错误是:

05-21 13:17:45.066: E/AndroidRuntime(3973): FATAL EXCEPTION: main 
05-21 13:17:45.066: E/AndroidRuntime(3973): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libx264.so.130" needed by "libffmpeg.so"; caused by load_library(linker.cpp:745): library "libx264.so.130" not found 

我想创建libffmpeg.so,我用-lx264 我以为所有的链接库时,将被纳入到最终输出库。

但无论如何,让我试着找出解决方案。 我把libx264.so或libx264.so.130放在几个目录中,例如/ jni,/ libs,/ obj等。

或者我也尝试在jni的Android.mk中添加-lx264。

但存在相同的错误。

所以我的问题是: (1)当gcc创建共享库时,输出.so库是否包含链接共享库,这里是libx264.so?

(2)我上面的项目出了什么问题?

回答

3
  1. 当GCC创建共享库,该output.so将不包括链接库,出现这种情况仅适用于静态库,虽然output.so将有一个动态的部分表示,现在需要什么都库它properly.if运行

    readelf -d libffmpeg.so

    它会显示其所需要什么所有的库进行链接。现在链接器尝试链接并加载所有需要的库。在你的情况下,它不能找到libx264.so.130,因为它不包含在你的项目中。

  2. 我还没有尝试过你在做什么,但将库复制到jni或lib文件夹将无法帮助我相信,您将不得不将它包含在您的make文件中作为PREBUILT_SHARED_LIBRARY。我认为这个链接可能会解决您的问题。 How can i link prebuilt shared Library to Android NDK project?

+0

最后应该在哪里添加共享库? PREBUILT_SHARED_LIBRARY? LOCAL_JNI_SHARED_LIBRARIES? LOCAL_SHARED_LIBRARIES? –

1

@digitzedx,我认为你的答案是非常不错的。所以我按照说明为libx264.so添加预建库,就像我为libffmpeg所做的一样。所以

include $(CLEAR_VARS) 
LOCAL_MODULE := libx264_prebuilt 
LOCAL_SRC_FILES := libx264.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
include $(PREBUILT_SHARED_LIBRARY) 

然后:

# Note: I have put commands for ffmpeg_prebuilt 
LOCAL_SHARED_LIBRARIES := ffmpeg_prebuilt 
LOCAL_SHARED_LIBRARIES += libx264_prebuilt 
LOCAL_LDLIBS += -llog -ljnigraphics -lz -dl -lx264 
include $(BUILD_SHARED_LIBRARY) 

在Android SRC,加

System.loadLibrary("x264") 
System.loadLibrary("ffmpeg") 
System.loadLibrary("native_sample") 

建设项目显示在控制台上说: libffmpeg.so安装,libnative_sample.so,在libs/armeabi-v7a中的libx264.so,其中libnative_sample.so是我的jni程序。

再次,相同的错误存在:libx264.so.130没有找到

我试图用LOCAL_LDLIBS的不同的顺序,它不会改变。

卡住了。帮帮我!

我认为也许问题在于: 它正在寻找libx264.so.130,但我只能将库命名为libx264。 但是readelf -d显示libx264.so中的SONAME是libx264.so.130 不知道系统正在查找什么,文件名或文件中的SONAME?

+0

好吧,我看到一篇文章“Android JNI,如何使用soname libxx.so.1.2.3加载库”后找到了一个简单的解决方法。我将libx264.so.130复制到设备的存储中,并使用System.load(“libx264.so.130”)。现在它工作了! – user1914692

+0

我在想也许我也可以改变libffmpeg.so的ELF,将它对libx264.so.130的依赖改为libx264.so。这是否合理?我在这里找到解决方案:http://stackoverflow.com/questions/2759254/how-can-i-change-the-filename-of-a-shared-library-after-building-a-program-that但是我没有'试过了。 – user1914692

+0

最后应该在哪里添加共享库? PREBUILT_SHARED_LIBRARY? LOCAL_JNI_SHARED_LIBRARIES? LOCAL_SHARED_LIBRARIES? –

相关问题