【发布时间】:2012-06-19 00:13:08
【问题描述】:
问题:
我正在 Eclipse 中构建 Android 应用程序,它使用共享库 libgstreamer-0.10.so(为 android-8 平台编译的 GStreamer-android NDK Bundle 库)。我在项目根文件夹中创建了新文件夹libs/armeabi 并将其放在那里。此外,我已将它附带的所有其他库(其中 158 个)放在同一个文件夹中。如果我把它放在我的主要活动代码中:
static{
System.loadLibrary("gstreamer-0.10");
}
并在 Android-8 模拟器上构建/安装/运行我的应用程序,它会引发此错误:
06-15 21:54:00.835: E/AndroidRuntime(402): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]: 33 could not load needed library 'libglib-2.0.so' for 'libgstreamer-0.10.so' (load_library[1104]: Library 'libglib-2.0.so' not found)
现在,libglib-2.0.so 和libgstreamer-0.10.so 在同一个文件夹中,为什么没有加载?我知道链接器试图从/system/lib 加载它,而libglib-2.0.so 只是不存在,但为什么它不从libgstreamer-0.10.so 所在的位置加载它?
所以我用这个命令去发现libgstreamer-0.10.so依赖于哪些库:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
结果:
Dynamic section at offset 0x118b64 contains 29 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libglib-2.0.so]
0x00000001 (NEEDED) Shared library: [libgobject-2.0.so]
0x00000001 (NEEDED) Shared library: [libgthread-2.0.so]
0x00000001 (NEEDED) Shared library: [libgmodule-2.0.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x0000000e (SONAME) Library soname: [libgstreamer-0.10.so]
0x00000010 (SYMBOLIC) 0x0
前四个libglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so 都位于设备上的同一文件夹中libgstreamer-0.10.so 位于(/data/data/com.marko.gstreamer_test/lib)中。
逻辑解决方案:
所以,我尝试在加载 libgstreamer-0.10.so 之前加载这四个库,并且成功了:
static{
System.loadLibrary("glib-2.0");
System.loadLibrary("gthread-2.0");
System.loadLibrary("gobject-2.0");
System.loadLibrary("gmodule-2.0");
System.loadLibrary("gstreamer-0.10");
}
我的问题是:
我能否以某种方式告诉链接器也从应用程序位置加载库?就像添加路径到一些环境变量或其他东西......类似于 Linux 上的 PATH。
我的解决方案是否有一些不好的副作用?我的意思是,链接器在加载 libgstreamer-0.10.so 之前也会这样做。但这会带来什么问题吗?
我可以将我的库安装到无根设备上的 /system/lib 文件夹吗?
【问题讨论】:
-
那个 hack 实际上是 Android 开发者自己推荐的解决方案:groups.google.com/forum/?fromgroups#!topic/android-ndk/… 有了这样的技术决策,难怪 Android 有这么多 bug。
-
您如何确定要显式加载哪些库?
-
@dpk
arm-linux-androideabi-readelf -d libgstreamer-0.10.so给出了依赖项列表。其中一些已经加载(libc 等),但有些需要显式加载。
标签: android linker android-ndk gstreamer