La mia domanda è diretta allo sviluppo nativo di Android per sistemi Android a 64 bit.Supporto NDK -multlib per Android con gradle
Sto cercando un modo per configurare il supporto di librerie native compilate a 32 bit su un sistema Android a 64 bit utilizzando il sistema gradle build. Le librerie che l'applicazione dovrebbe utilizzare sono disponibili solo come build a 32 bit. Sarebbe molto dispendioso in termini di tempo e incline a portare queste librerie a 64 bit.
Quindi, voglio configurare gradle per distribuire questi binari a 32 bit pre-compilati e per utilizzare anche una versione a 32 bit dell'applicazione Android.
L'attuale configurazione porta alla seguente errore:
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)
Sembra come se il PathClassLoader
guarda nelle directory sbagliate. Ho controllato il file apk fornito e mancano le librerie. Non esiste una cartella lib
all'interno dell'apk. Il sistema di compilazione non include le librerie a 32 bit. Poiché esiste una sola versione di preinstallazione per armv7
, queste librerie si trovano nella cartella app/src/main/jnilibs
.
Devo aggiungere che questa configurazione funziona perfettamente per qualsiasi sistema Android a 32 bit. L'ho provato con l'emulatore e un dispositivo fisico prima.
Come si dovrebbe attivare il supporto multiarch 32/64 bit utilizzando gradle? O come è possibile distribuire un'applicazione a 32 bit su un sistema Android a 64 bit con Android Studio/gradle?
Ho cercato sul Web e ho trovato un collegamento relativo all'argomento, ma si riferisce al vecchio sistema di build: https://source.android.com/source/64-bit-builds.html. Non so come adottare la descrizione di gradle.
Sto utilizzando Android Studio (Build: 141.1989493, 6 giugno 2015). Il project/build.gradle
non è stato toccato. Il file app/build.gradle
assomiglia a questo:
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'])
}
Qualcuno potrebbe spiegare per favore cosa è questo "grasso" in "productFlavors" e se è obbligatorio? – mithil1501