Ho un'app con 2 librerie native. 1st funziona molto più velocemente su ARMv7 quindi ho la versione sia per ARMv7 che per ARMv5. 2nd funziona allo stesso modo su entrambe le piattaforme, quindi viene fornita solo la libreria ARMv5.Android L Preview non ricerca le librerie native nella cartella "armeabi" (UnsatisfiedLinkError)
cartella My libreria nativa si presenta così:
/jniLibs/
|
+---armeabi/
| |
| +---libFirstLibrary.so
| +---libSecondLibrary.so
|
+---armeabi-v7a/
|
+---libFirstLibrary.so
L'applicazione funziona bene su tutti i dispositivi e le versioni di Android in produzione.
Quando ho provato sul mio Nexus 5 con L-anteprima (martello-lpv79-anteprima-ac1d8a8e.tgz), ottengo questo errore:
java.lang.UnsatisfiedLinkError: Couldn't load SecondLibrary from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.package-1, /vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:610)
Il problema è che, nonostante il fatto Nexus 5 ha CPU_ABI
impostato su armeabi-v7a
e CPU_ABI2
impostato su armeabi
, L-Preview utilizza solo il valore CPU_ABI
e cerca "SecondLibrary" solo nella cartella "armeabi-v7a" e si blocca in quanto non è presente.
Quando copio il file .so anche nella cartella "armeabi-v7a", tutto va bene ma l'APK è di 3,5 MB più grande che non mi piace molto.
È solo un bug di Android L-Preview o di qualche "nuova funzionalità"?
In generale si, ma quasi tutti i dispositivi supportano due ABI. Nel mio caso, Nexus 5 supporta: 'CPU_ABI = armeabi-v7a' e' CPU_ABI2 = armeabi'. Lo stesso meccanismo è usato per i dispositivi Intel in cui ABI primario è 'x86', ma secondario è' armeabi', quindi la mia app funziona bene anche su dispositivi Intel anche se non esiste una libreria nativa nella cartella 'x86'. Secondo me, non c'è motivo per cui questo effetto non funzioni anche su L-Preview. – xsveda
Sì, ma il gestore pacchetti controlla solo le librerie nella directory ABI secondaria se non ne sono state trovate nella directory ABI primaria. La documentazione che ho linkato dice: "il servizio gestore pacchetti eseguirà la scansione di .apk e cercherà qualsiasi libreria condivisa del modulo: lib//lib .so [...] Se ne viene trovato uno, viene copiato sotto' $ APPDIR/lib/lib .so' [...] Se non viene trovato nessuno e viene definito un ABI secondario, il servizio esegue la scansione delle librerie condivise del modulo: lib//lib . così". Quindi se la directory ABI primaria non è vuota, non controllerà il secondario. –
mstorsjo
Ecco cosa intendevo nella mia risposta originale: estrae sempre e solo da una singola directory di architettura, che può essere l'ABI primario o secondario. – mstorsjo