【问题标题】:Why does it complain one library not found, even if I have included it?为什么它会抱怨找不到一个库,即使我已经包含了它?
【发布时间】:2013-05-22 07:01:19
【问题描述】:

这是一个与视频处理相关的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) 我上面的项目有什么问题?

【问题讨论】:

    标签: android gcc shared-libraries


    【解决方案1】:
    1. 当 GCC 创建一个共享库时,output.so 将不包含链接的库,这仅发生在静态库中,尽管 output.so 将有一个动态部分说明所有库都需要哪些才能正确链接.如果你运行

      readelf -d libffmpeg.so

      它将显示它需要的所有库。现在链接器尝试链接并加载所有需要的库。在您的情况下,它找不到 libx264.so.130,因为它不包含在您的项目中。

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

    【讨论】:

    • 最后应该在哪里添加共享库?! PREBUILT_SHARED_LIBRARY ? LOCAL_JNI_SHARED_LIBRARIES ? LOCAL_SHARED_LIBRARIES ?
    【解决方案2】:

    @digitzedx,我认为你的回答非常正确。所以我按照说明为 libx264.so 添加预构建库,就像我为 libffmpeg.so 所做的那样

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

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

    同样的错误存在:libx264.so.130 not found

    我尝试使用不同的LOCAL_LDLIBS命令,没有改变。

    卡在这里。救命!

    我认为问题可能出在: 它正在寻找 libx264.so.130,但我只能将库命名为 libx264。 但是 readelf -d 显示 libx264.so 中的 SONAME 是 libx264.so.130 不确定系统正在寻找什么、文件名或文件中的 SONAME?

    【讨论】:

    • 好的,在查看了一篇文章“Android JNI,如何使用 soname libxx.so.1.2.3 加载库”后,我找到了一个简单的解决方法。我将 libx264.so.130 复制到设备的存储中,并使用 System.load("libx264.so.130")。现在可以了!
    • 我在想也许我也可以更改 libffmpeg.so 的 ELF,将其对 libx264.so.130 的依赖更改为 libx264.so。这合理吗?我在这里找到了解决方案:stackoverflow.com/questions/2759254/… 但我还没有尝试过。
    • 最后应该在哪里添加共享库?! PREBUILT_SHARED_LIBRARY ? LOCAL_JNI_SHARED_LIBRARIES ? LOCAL_SHARED_LIBRARIES ?
    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2013-10-02
    • 2017-04-26
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多