1

I'm trying to create an android app that uses both the CNU Project Sphinx library for android and the Spotify library for android. I can implement the libraries fine in separate projects, but when I try and combine them into one, I get the error:

14178-14178/com.tmacstudios.spotifyvoice E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.tmacstudios.spotifyvoice, PID: 14178
  java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tmacstudios.spotifyvoice-2/base.apk"],nativeLibraryDirectories=[/data/app/com.tmacstudios.spotifyvoice-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libgnustl_shared.so"
      at java.lang.Runtime.loadLibrary(Runtime.java:367)
      at java.lang.System.loadLibrary(System.java:988)
      at com.spotify.sdk.android.player.NativeSdkPlayer.nativeInit(NativeSdkPlayer.java:44)
      at com.spotify.sdk.android.player.NativeSdkPlayer.<clinit>(NativeSdkPlayer.java:34)
      at com.spotify.sdk.android.player.Player.<init>(Player.java:310)
      at com.spotify.sdk.android.player.Player.create(Player.java:356)
      at com.spotify.sdk.android.player.Player.access$000(Player.java:86)
      at com.spotify.sdk.android.player.Player$Builder.build(Player.java:282)
      at com.spotify.sdk.android.player.Spotify.getPlayer(Spotify.java:110)
      at com.spotify.sdk.android.player.Spotify.getPlayer(Spotify.java:76)
      at edu.cmu.pocketsphinx.demo.PocketSphinxActivity.onActivityResult(PocketSphinxActivity.java:272)
      at android.app.Activity.dispatchActivityResult(Activity.java:6758)
      at android.app.ActivityThread.deliverResults(ActivityThread.java:4726)
      at android.app.ActivityThread.handleSendResult(ActivityThread.java:4773)
      at android.app.ActivityThread.access$1500(ActivityThread.java:205)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:145)
      at android.app.ActivityThread.main(ActivityThread.java:6895)
      at java.lang.reflect.Method.invoke(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Does anyone know how to fix this? I'm not sure what else to include, so here's my build.gradle file for Module:app -

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.tmacstudios.spotifyvoice"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'

    // This library handles authentication and authorization
    compile 'com.spotify.sdk:spotify-auth:1.0.0-beta12@aar'

    // This library handles music playback
    compile 'com.spotify.sdk:spotify-player:1.0.0-beta12@aar'

    // All other dependencies for your app should also be here:

    compile 'com.android.support:appcompat-v7:21.0.3'
}

Thanks for your help.

Oblivionkey3
  • 1,752
  • 2
  • 17
  • 25
  • 2
    My guess is that they both have NDK libraries, but they have a varying set of CPU architectures that they support. Particularly for devices with 64-bit CPUs, Android wants to use a consistent set of libraries: all 64-bit or all 32-bit. So, if one library publishes 64-bit and another publishes only 32-bit, somebody loses, and IIRC it's the 32-bit-only publisher. – CommonsWare Apr 05 '16 at 16:03
  • So how do you think I could solve this then? – Oblivionkey3 Apr 05 '16 at 16:04
  • 2
    I have been meaning to work out recipes for this, but I haven't run into the situation yet in my own development, so I do not have a reproducible test case. First, examine the contents of each library and see what CPU architectures seem to be supported. Come up with a common subset. Then, see what Android Plugin for Gradle options there are to package only that subset of binaries with your app. I *think* that there is a way to do this, but I do not recall the details. – CommonsWare Apr 05 '16 at 16:11
  • You're officially one of the coolest people on the planet right now; you were spot on. Spotify only defines jni libraries for armeabi, armeabi-v7a, and x86, so I deleted the extraneous architecture libraries that were supported by Sphinx and it worked. – Oblivionkey3 Apr 05 '16 at 18:09
  • Thanks for the kind words! If you get a spare moment, write up your details as an answer. – CommonsWare Apr 05 '16 at 18:12

2 Answers2

1

Just to more clearly show the answer to my question, here's the information in the comment thread that solved my problem:

My guess is that they both have NDK libraries, but they have a varying set of CPU architectures that they support. Particularly for devices with 64-bit CPUs, Android wants to use a consistent set of libraries: all 64-bit or all 32-bit. So, if one library publishes 64-bit and another publishes only 32-bit, somebody loses, and IIRC it's the 32-bit-only publisher. Examine the contents of each library and see what CPU architectures seem to be supported. Come up with a common subset. -CommonsWare

You were spot on. Spotify only defines jni libraries for armeabi, armeabi-v7a, and x86, so I deleted the extraneous architecture libraries that were supported by Sphinx and it worked. -Me

Oblivionkey3
  • 1,752
  • 2
  • 17
  • 25
0

Thanks for the solution !

My project was working fine but using Spotify aar. When I added the deezer aar, my phone 64b was then crashing.

They do not support the same architecture see the screens :

Deezer aar

Spotify aar

SO I had to manually delete the extras from deezer aar in order to make it working :

deezer aar working

Joxad
  • 69
  • 3