1

NDKを使用してAndroidアプリにlibspotifyを読み込もうとしています。ライブラリlibspotify++とjlibspotifyを使用しています。すべてがロードされているようですが、libspotifyがライブラリ「libspotify.so.12」をロードしようとするとクラッシュします

Androidでシンボリックリンクを使用できません。

コード:

public class Session {
    static {
        System.loadLibrary("spotify");
        System.loadLibrary("jlibspotify");
    }

}

ログ:

05-29 17:27:22.559: D/dalvikvm(32606): threadid=1: still suspended after undo (sc=1 dc=1)
05-29 17:27:25.527: D/dalvikvm(32606): Trying to load lib /data/data/se.warting.spotify/lib/libspotify.so 0x41692100
05-29 17:27:25.535: D/dalvikvm(32606): Added shared lib /data/data/se.warting.spotify/lib/libspotify.so 0x41692100
05-29 17:27:25.535: D/dalvikvm(32606): No JNI_OnLoad found in /data/data/se.warting.spotify/lib/libspotify.so 0x41692100, skipping init
05-29 17:27:25.543: D/dalvikvm(32606): Trying to load lib /data/data/se.warting.spotify/lib/libjlibspotify.so 0x41692100
05-29 17:27:27.637: W/dalvikvm(32606): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lse/sony/tunefeud/spotiwrap/Session;
05-29 17:27:28.824: D/AndroidRuntime(32606): Shutting down VM
05-29 17:27:28.824: W/dalvikvm(32606): threadid=1: thread exiting with uncaught exception (group=0x40a421f8)


05-29 17:27:28.855: E/AndroidRuntime(32606): FATAL EXCEPTION: main
05-29 17:27:28.855: E/AndroidRuntime(32606): java.lang.ExceptionInInitializerError
05-29 17:27:28.855: E/AndroidRuntime(32606):    at se.warting.spotify.PocActivity.onCreate(PocActivity.java:18)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.Activity.performCreate(Activity.java:4465)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.os.Looper.loop(Looper.java:137)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at android.app.ActivityThread.main(ActivityThread.java:4424)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at java.lang.reflect.Method.invokeNative(Native Method)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at java.lang.reflect.Method.invoke(Method.java:511)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at dalvik.system.NativeStart.main(Native Method)
05-29 17:27:28.855: E/AndroidRuntime(32606): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:   118 could not load needed library 'libspotify.so.12' for 'libjlibspotify.so' (load_library[1091]: Library 'libspotify.so.12' not found)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at java.lang.Runtime.loadLibrary(Runtime.java:370)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at java.lang.System.loadLibrary(System.java:535)
05-29 17:27:28.855: E/AndroidRuntime(32606):    at se.warting.spotify.spotiwrap.Session.<clinit>(Session.java:6)
05-29 17:27:28.855: E/AndroidRuntime(32606):    ... 15 more

これは私がobjdumpから得たものです:

$arm-linux-androideabi-objdump -p libs/armeabi/libjlibspotify.so  | grep NEEDED
  NEEDED               libspotify.so.12
  NEEDED               libstdc++.so
  NEEDED               libm.so
  NEEDED               libc.so
  NEEDED               libdl.so
$arm-linux-androideabi-objdump -p libs/armeabi/libspotify.so  | grep NEEDED
  NEEDED               libm.so
  NEEDED               libc.so
  NEEDED               libdl.so 

誰かがそれを機能させるために何をすべきか知っていますか?

4

3 に答える 3

4

ここで Java/JVM のスキルを試して、Android/Dalvik に適用してみます。

  1. System.loadLibrary()引数として JNI ライブラリ名が必要です。この場合、libspotify は JNI ライブラリではありません (決してそうではありません) が、libjlibspotify は JNI ライブラリのようです。最初の呼び出しで、関数が欠落していることがログに記録されていることに注意してくださいJNI_OnLoad。これは通常、良いヒントです。System.loadLibrary()ただし、共有ライブラリが見つかる限りは受け入れます。そのため、このシナリオで呼び出しが失敗することはありません。

  2. JNI ライブラリの依存ライブラリは、プラットフォームの組み込み共有ライブラリ ロード メカニズムによって自動的にロードされます。この場合、libjlibspotify は に依存するlibspotify.so.12ため、そのようなファイルがローダーのパスにある場合、libjlibspotify がロードされるたびにシステムによって自動的にロードされます。

    したがって、この場合の適切な Java コードは次のようになります。

    public class Session {
        static {
            System.loadLibrary("jlibspotify");
        }
    }
    

    ただし、呼び出しの一部として依存ライブラリが見つからない場合、System.loadLibrary()その呼び出しは失敗し、エラーが発生します (欠落している依存ファイルUnsatisfiedLinkErrorに関するログを参照してください)。libspotify.so.12

  3. libspotify 12 は現在、libspotify.so.12.1.45(いくつかのシンボリック リンクlibspotify.solibspotify.so.12そのファイルを指す) としてアーカイブで出荷されます。このシナリオで libjlibspotify がどのようにビルドされたかについては何も知りませんが、Android の設定でシンボリック リンクが関連しない場合は、代わりに libjlibspotify をビルドしlibspotify.so.12.1.45てアーカイブからロードする必要があります。名前の変更は必要ありません。

于 2012-05-30T13:15:49.137 に答える
1

libspotify の作成方法のビルド プロセスを適切な名前に変更する必要があるようです。

最も簡単な方法は、Android NDK ビルド システムを使用することです。これにより、ライブラリが正しくコンパイルおよびリンクされます。

于 2012-05-30T07:02:19.127 に答える
1

Mārtiņš からの回答は正しいです。Android の NDK ビルド システムでビルドする必要があります。ライブラリを制御できない場合は、次の回避策があります。

ライブラリを System.loadLibrary( "JLibSpotify" ); でロードする代わりに、/data/data/se.warting.spotify/lib/libspotify.so を /data/data/se.warting.spotify/libspotify.so.12 に手動でコピーし、次のようにライブラリをロードしました。

System.load("/data/data/se.warting.spotify/libspotify.so.12");

その後、通常どおり jlibspotify をロードできました。

System.loadLibrary("jlibspotify");
于 2012-05-30T07:43:32.757 に答える