【问题标题】:Can't use libspotify 12 in android app无法在 Android 应用程序中使用 libspotify 12
【发布时间】:2012-05-29 15:42:17
【问题描述】:

我正在尝试使用 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 

有谁知道如何让它发挥作用?

【问题讨论】:

  • 你能检查一下 libjlibspotify.so 文件依赖于哪些共享库吗?您可以使用以下命令对 objdump 执行此操作:arm-linux-androideabi-objdump.exe -p libtest.so | grep NEEDED
  • 我无法格式化输出,所以我编辑了我的问题,我猜是需要的库是问题,我该如何更改它?
  • 您的日志显示 libspotify.so 加载正常 - 看起来 jlibspotify 不正确地依赖于 libspotify.so.12。

标签: android android-ndk spotify


【解决方案1】:

我将在这里打破我的 Java/JVM 技能,并尝试在 Android/Dalvik 上应用它们。

  1. System.loadLibrary() 需要一个 JNI 库名称作为其参数。在这种情况下,libspotify 不是(也永远不是)JNI 库,但 libjlibspotify 似乎是。请注意日志中的第一个呼叫是如何抱怨缺少 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,不需要重命名。

【讨论】:

  • 1.不是真的。您可以使用 System.loadLibrary() 加载任何共享库(因此也许稍后您可以在自己的进程中搜索符号)。即使那些依赖库不包含任何 JNI 代码。即使对于 JNI 库,没有 JNI_OnLoad 也是完全有效的情况。
  • jlibspotify 是使用 Android 的 ndk-build 构建的。 libspotify 不是。
【解决方案2】:

您似乎需要更改创建 libspotify 的构建过程以获得正确的名称。

最简单的方法是使用 Android NDK 构建系统 - 它会正确编译和链接库。

【讨论】:

  • 肯定会,但我做不到。我猜这个问题是由 spotify 引起的。
【解决方案3】:

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2021-11-19
    • 2014-09-14
    • 2012-05-08
    • 1970-01-01
    • 2017-08-17
    • 2013-09-28
    相关资源
    最近更新 更多