【问题标题】:Dynamic .so vs so.NUMBER libraries loading on Android/Linux在 Android/Linux 上加载动态 .so 与 so.NUMBER 库
【发布时间】:2014-12-17 12:26:50
【问题描述】:

我正在从源代码编译 gstreamer 1.4.4,通过使用 configure --host=arm-linux-androideabi 标志来获取 ARM .so 和 .a 二进制文件。 然后我使用 gst-android 0.10 构建工具将库链接到gstreamer_android.so。 这很好用。 问题是我不知道如何在 Android 上部署 gst-rtsp-server.so。所有的库都嵌入到 .so 文件中,但是这个不依赖于 gstreamer_andorid.so 但是:

0x00000001 (NEEDED)                     Shared library: [libgstreamer-1.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgio-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libintl.so.8]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libdl.so]
0x0000000e (SONAME)                     Library soname: [libgstrtsp-1.0.so.0]

(即使我创建自定义 Android.mk 并将 LOCAL_SHARED_LIBRARIES 指向 gstreamer_android.so)

所以我不知道如何从 gstreamer_android.so 中“注册”那些 libgstreamer-1.0.so.0 或将 gstrtspserver.so 附加到 gstreamer_android.so 中。我后来尝试通过添加到 gst-android 的 Android.mk 中,但随后出现此错误:

gst-build-armeabi/gstreamer_android.o:gstreamer_android.c:function gst_android_register_static_plugins: error: undefined reference to 'gst_plugin_rtspserver_register'

所以我很明显做错了什么,谁能指出我正确的方向? 谢谢。

【问题讨论】:

    标签: android linux gcc shared-libraries


    【解决方案1】:

    首先,您需要了解外部库版本控制。我发现this document 很有帮助。

    其次,您需要意识到libintl.so 未命名为libintl.so.8 可能是有原因的——它们可能与ABI 不兼容。将 libintl.so 重命名(或创建符号链接)到 libintl.so.8 将导致它被发现,但可能会导致运行时崩溃。

    最后,您依赖libintl.so.8 的原因可能是在链接时您使用了错误的libintl.so(具有SONAMElibintl.so.8 而不是libintl.so)。您是从 gnulib 自己构建的 libintl.so 吗? android 树中可能有不同的版本。

    【讨论】:

    • 感谢您的回答。我的库应该与 ABI 兼容。我试图发布我的问题的简化版本:我正在从源代码交叉编译 gstreamer,包括 glib 和所有其他依赖项。一切看起来都很好,除了我在运行时出现这个错误。也许我可以使用您在 oracle 文档中的链接中的 -h 选项。如果我重命名库以匹配版本,我会得到 SIGSEGV 和如下消息: E/GLib+GLib-GObject(8033): g_param_spec_uint64: assertion 'default_value >= minimum && default_value
    • 找到了我的问题的解决方案:一些库与 x64 版本的 glib 链接,而不是我想要的 ARM 版本。我通过设置 GLIB_CFLAGS 和 GLIB_LIBS 环境解决了这个问题。配置脚本调用的变量。
    • 编辑了我的问题,让我更清楚我想做什么
    【解决方案2】:

    好的,找到了解决方案, 将这样的内容添加到 gst-android/ndk-build/gstreamer-1.0.mk 就足够了

    GSTREAMER_RTSP_SERVER_LIBS := -Wl,--whole-archive /path/to/gst-rtsp-server-1.4.4/gst/rtsp-server/.libs/libgstrtspserver-1.0.a
    

    然后将此标志附加到 GSTREAMER_ANDROID_LIBS,如下所示:

    GSTREAMER_ANDROID_LIBS := $(GSTREAMER_RTSP_SERVER_LIBS) $(call fix-deps,-lgiognutls, -lhogweed)
    

    如果您需要自定义 Android.mk 来构建 RTSP 服务器,请从这里开始

    Android.mk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多