問題:
libgstreamer-0.10.so
共有ライブラリ(GStreamer-android-8プラットフォーム用にコンパイルされたandroid NDKバンドルライブラリ)を使用するEclipseでAndroidアプリを構築しています。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
最初の4つ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
)にある同じフォルダにあります。
論理的な解決策:
したがって、ロードする前にこれらの4つのライブラリをロードしようとしましたが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フォルダーにライブラリをインストールできますか?