问题:
我正在 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文件夹吗?