8

Moje pytanie jest skierowane do rodzimego rozwoju Androida dla 64-bitowych systemów Android.Android NDK -multlib wsparcie przy użyciu gradle

Szukam sposobu konfigurowania obsługi 32-bitowych skompilowanych bibliotek natywnych w 64-bitowym systemie Android przy użyciu systemu kompilacji gradle. Biblioteki, których powinna używać aplikacja, są dostępne tylko w wersji 32-bitowej. Byłoby bardzo czasochłonne i podatne na błędy przenoszenie tych bibliotek na 64-bitowe.

Dlatego chcę skonfigurować gradle do wdrożenia tych wstępnie zbudowanych plików binarnych 32-bitowych i do korzystania z 32-bitowej wersji aplikacji Android.

Obecna konfiguracja prowadzi do następującego błędu:

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) 

Wydaje się jakby PathClassLoader wygląda w niewłaściwych katalogów. Sprawdziłem dostarczony plik APK i brakuje w nim bibliotek. Wewnątrz apk nie ma folderu lib. System kompilacji nie łączy się z 32-bitowymi bibliotekami. Ponieważ istnieje tylko jedna wersja dla wersji wstępnej dla armv7, te biblioteki znajdują się w folderze app/src/main/jnilibs.

Muszę dodać, że ta konfiguracja działa doskonale dla każdego 32-bitowego systemu Android. Próbowałem go z emulatorem i fizycznym urządzeniem wcześniej.

W jaki sposób należy aktywować obsługę wielobitowego 32/64-bitowego przy użyciu gradle? Albo jak można wdrożyć aplikację 32-bitową do 64-bitowego systemu Android przy użyciu Android Studio/gradle?

Przeszukałem Internet i znalazłem jeden link dotyczący tematu, ale dotyczy on starszego systemu kompilacji: https://source.android.com/source/64-bit-builds.html. Nie wiem, jak zastosować opis do stopniowania.

Używam Androida Studio (kompilacja: 141.1989493, 6 czerwca 2015 r.). The project/build.gradle jest nietknięty. Plik app/build.gradle wygląda następująco:

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']) 
} 

Odpowiedz

1

W celu uzyskania wdrażanie aplikacji 32bit na 64bit system Android trzeba zdefiniować armv7 productFlavor i podfolder folderu jniLibs nazewnictwa odpowiednią architekturę.

Definicja produktu smak w app/build.gradle:

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

Natywna struktura biblioteki:

app/src/main/jniLibs/armeabi-v7a 
+0

Czy ktoś mógłby wyjaśnić, co to jest "tłuszcz" w "productFlavours" i czy jest to obowiązkowe? – mithil1501

2

Koncepcja mulilib jest tylko dla projektów, które są częścią systemu Android kompilacji i nie należy ustawić opcja android: multiarch, ponieważ posiadasz tylko 32-bitowe biblioteki, ponieważ ta opcja jest przeznaczona tylko dla aplikacji, które udostępniają zarówno 32, jak i 64-bitowe biblioteki innym zainstalowanym aplikacjom.

64-bitowe systemy Android obsługują bezpośrednio aplikacje 32-bitowe. Musisz tylko poprawnie spakować swoją aplikację z plikami .so wewnątrz pliku lib/(armeabi-v7a,x86,...) pakietu APK, tak jak w przypadku wszystkich urządzeń z Androidem.

W czasie instalacji zostaną zainstalowane biblioteki preferowanej przez urządzenie architektury. tj: jeśli nie ma folderu x86_64, biblioteki x86 zostaną zainstalowane/jeśli nie ma folderu arm64-v8a, biblioteki armeabi-v7a zostaną zainstalowane, a twoja aplikacja będzie działać w trybie 32-bitowym.

Jeśli nie masz niczego pod libem, oznacza to, że Android Studio nie wie o Twoich plikach .so. Domyślnie wyszuka je wewnątrz jniLibs/(armeabi-v7a,x86,...), dlatego powinieneś umieścić je tam lub zmienić sourceSets.main.jniLibs.srcDir w wybranym katalogu.

Powiązane problemy