Не удается найти файл .so на 64-битном устройстве Android

Использование aviary android sdk с использованием android studio и gradle build. Созданное приложение работает нормально на всех устройствах с 32-битной архитектурой.

То же приложение выдает следующую ошибку на 64-битном устройстве [например. Сони С4]

    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file 
"/data/app/com.myapp/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libaviary_moalite.so"

часть gredle.build

dependencies {
    ...
    compile 'com.android.support:multidex:1.0.0'
    compile 'com.facebook.fresco:fresco:0.8.1+'
    compile 'com.facebook.fresco:imagepipeline-okhttp:0.8.1+'
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.adobe.creativesdk:image:4.0.0'
}

Ссылка, которая не сработала

Не удается найти родную библиотеку ARM64 NDK с помощью Android Studio (1.3 RC)

Та же ошибка при использовании любого из используемых решений.

Как использовать 32-разрядные собственные библиотеки на 64-разрядном устройстве Android

Получение ошибки, как

Error:(16, 0) Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

Я не уверен, что я делаю неправильно, или он вообще не поддерживается.


person Umesh Aawte    schedule 25.11.2015    source источник
comment
У вас есть нативные библиотеки, которые вы создаете сами или только импортируете их из внешних источников?   -  person Alex Cohn    schedule 25.11.2015
comment
Импортировано из внешнего источника, который представляет собой Adobe creativesdk   -  person Umesh Aawte    schedule 25.11.2015


Ответы (2)


Похоже, что некоторые из используемых вами пакетов поставляются с 64-битными библиотеками, а некоторые — нет. Чтобы ваш APK был только 32-битным, я использую

android {
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a'
        }
    }
}

Вы также можете поиграть с include 'armeabi', если это актуально.

person Alex Cohn    schedule 25.11.2015
comment
да, вы правы, если пакеты с 64-битными библиотеками. Пробуем ваше решение - person Umesh Aawte; 26.11.2015
comment
@Alex Cohn: Не могли бы вы рассказать мне, как узнать, какие библиотеки 64-битные, а какие 32-битные в моем приложении? Потому что, используя приведенное выше закрытие, моя проблема решена. Я использовал только одну библиотеку и не знаю, какие другие библиотеки вызывают эту ошибку. - person Madhan; 17.01.2017
comment
@Madhan: это обычно происходит, когда вы используете готовые библиотеки. Вы найдете файлы build/intermediates/exploded-aar/??/jni/arm64-v8a/lib???.so. Также вместо arm64-v8a можно было увидеть x86_64. Вы можете безопасно удалить эти библиотеки из вашего APK. - person Alex Cohn; 17.01.2017

Я решил этот случай, выполнив следующие шаги:

  1. Я переместил папки armeabi и x86 из: \src\main\jniLibs в: \libs

    Не забудьте также переместить все файлы в эти папки: файлы *.so должны находиться там.

  2. Я добавил в свой build.gradle следующее:

    sourceSets.main {
      jniLibs.srcDir 'src/main/libs'
    }
    
  3. Очистить + перестроить проект

    *если вы используете multidex, убедитесь, что эти строки были добавлены в build.gradle:

    defaultConfig {
      multiDexEnabled true
    }
    
    dexOptions {
      preDexLibraries false
      javaMaxHeapSize "4g"
    }
    

Кроме того, это должно быть добавлено в ваш файл манифеста:

<application
    android:name="android.support.multidex.MultiDexApplication">
/application>

Надеюсь это поможет.

person Community    schedule 29.02.2016