は私がlibgstreamer-0.10.so
(アンドロイド-8プラットフォーム用にコンパイルのGStreamer-のAndroid NDKバンドルLIBS) libに共有使用し、EclipseでAndroidアプリを構築しています。私は新しいフォルダlibs/armeabi
をプロジェクトのルートフォルダに作成してそこに置いた。また、私はそれに付属の他のすべてのライブラリ(158個)を同じフォルダに入れました。私は私のメインのアクティビティコードでこれを置く場合:
static{
System.loadLibrary("gstreamer-0.10");
}
し、ビルド/アンドロイド-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
である場所からロードされていないのですか?
だから私は、このコマンドを使用してに依存するのlibs 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
に配置されている最初の4は(/data/data/com.marko.gstreamer_test/lib
に位置しています)をデバイス上に作成します。
論理的な解決策:
だから私はlibgstreamer-0.10.so
をロードする前に、私は、これらの4つのLIBSをロードしようと、それが働いた:
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");
}
を私の質問は以下のとおりです。
私は何とかアプリケーションの場所からもlibsをロードするようリンカーに指示できますか?いくつかの環境変数などにパスを追加するのと同じように... LinuxのPATHに似ています。
私のソリューションに悪い副作用がありますか?つまり、リンカは、libgstreamer-0.10.soをロードする前にこれを行うでしょう。しかし、これは何か問題を作りますか?
私のライブラリを/system/libフォルダにインストールすることはできますか?
実際にAndroid開発者自身が推奨する解決策は、https://groups.google.com/forum/?fromgroups#!topic/android-ndk/F7DnfSQt8qsですバギー。 –
明示的に読み込むライブラリをどのように決定しましたか? –
@dpk 'arm-linux-androideabi-readelf -d libgstreamer-0.10.so'は依存関係のリストを与えます。それらのうちのいくつかはすでにロードされていますが(libcなど)、明示的にロードする必要があります。 – chrisvarnz