Android NDK – поддержка multibib с использованием gradle

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

Я ищу способ настроить поддержку 32-разрядных скомпилированных исходных библиотек в 64-битной системе Android с использованием системы построения градиентов. Библиотеки, которые приложение должно использовать, доступны только в виде 32-битной сборки. Было бы очень много времени и ошибок, чтобы переносить эти библиотеки на 64-битные.

Следовательно, я хочу настроить gradle для развертывания этих предварительно созданных 32-битных двоичных файлов и использовать 32-битную версию приложения для Android.

Текущая конфигурация приводит к следующей ошибке:

E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: <application_name>, PID: 2170 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList[[zip file "/data/app/<application_name>/base.apk"], nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] enter code here`couldn't find "libmynativelibrary.so" at java.lang.Runtime.loadLibrary(Runtime.java:366) 

Кажется, что PathClassLoader смотрит в неправильные каталоги. Я проверил предоставленный файл apk и ему не хватает библиотек. В apk нет папки lib . Система сборки не объединяет 32-битные библиотеки. Поскольку для armv7 существует только одна предварительная версия, эти библиотеки находятся в папке app/src/main/jnilibs .

Я должен добавить, что эта настройка отлично работает для любой 32-битной системы Android. Я попробовал это с эмулятором и физическим устройством раньше.

Как следует активировать поддержку многоадресной 32/64-битной системы с помощью градиента? Или как можно развернуть 32-битное приложение в 64-битную систему Android с помощью Android Studio / gradle?

Я искал в Интернете и нашел одну ссылку по теме, но это относится к старой системе сборки: https://source.android.com/source/64-bit-builds.html . Я не знаю, как принять описание для градации.

Я использую Android Studio (Build: 141.1989493, June 6, 2015). project/build.gradle не тронут. Файл app/build.gradle выглядит так:

 apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "<application_name>" minSdkVersion 1 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true } } productFlavors { armv7 { ndk { abiFilter "armeabi-v7a" } } fat } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } 

Solutions Collecting From Web of "Android NDK – поддержка multibib с использованием gradle"

Концепция mulilib предназначена только для проектов, которые являются частью системной сборки Android, и вы не должны устанавливать параметр android: multiarch, поскольку у вас есть только 32-битные библиотеки, поскольку этот параметр предназначен только для приложений, которые предоставляют как 32, так и 64-битные библиотеки для других Установленное приложение.

64-битные Android-системы поддерживают 32-разрядные приложения напрямую. Вам нужно только правильно упаковать приложение с вашими .so-файлами внутри lib/(armeabi-v7a,x86,...) APK, как и для любых Android-устройств.

Во время установки будут установлены библиотеки архитектуры, которые предпочтительнее для устройства. Т.е.: если нет x86_64 папки, будут установлены x86 libs / если нет папки arm64-v8a, будут установлены библиотеки armeabi-v7a, и ваше приложение будет работать в 32-битном режиме.

Если у вас нет ничего под lib, это значит, что Android Studio не знает о ваших .so-файлах. По умолчанию он будет искать их внутри jniLibs/(armeabi-v7a,x86,...) , поэтому вы должны поместить их туда или изменить sourceSets.main.jniLibs.srcDir в каталог по вашему выбору.

Чтобы получить 32- armv7 productFlavor развертывание приложений для 64-битной Android-системы, необходимо определить armv7 productFlavor и подпапку внутри папки jniLibs назвав соответствующую архитектуру.

Определение вкуса продукта в app/build.gradle :

 android { productFlavors { armv7 { ndk { abiFilter "armeabi-v7a" } } fat } } 

Структура родной библиотеки:

 app/src/main/jniLibs/armeabi-v7a