我建立在Eclipse的Android應用它採用LIB libgstreamer-0.10.so
(編譯爲Android-8平臺的GStreamer功能的Android NDK包庫)共享。我在項目根文件夾中創建了新文件夾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文件夾嗎?
這個破解實際上是Android開發者自己推薦的解決方案:https://groups.google.com/forum/?fromgroups#!topic/android-ndk/F7DnfSQt8qs有了這樣的技術決策,難怪Android是如此越野車。 –
你是如何確定明確加載哪些庫的? – 2014-04-09 14:18:13
@dpk'arm-linux-androideabi-readelf -d libgstreamer-0.10.so'給出依賴關係列表。其中一些已經加載(libc等),但有些需要顯式加載。 – chrisvarnz