Soru 64 bit Android cihazında 32 bit yerel kütüphaneler nasıl kullanılır?


Uygulamamda yalnızca armeabi, armeabi-v7a ve x86 için derlenmiş bir yerel kitaplık kullanıyorum.

Bu kitaplık Samsung S6 gibi bir 64 bit cihaza yüklendiğinde, uygulama bir UnsatisfiedLinkError ile çöker.

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
    at java.lang.Runtime.loadLibrary(Runtime.java:366)
    at java.lang.System.loadLibrary(System.java:989)

Kütüphane maalesef kapalı kaynaklıdır. Kütüphaneyi 64 bit hedeflerle yeniden derlemeden bunu düzeltmenin herhangi bir yolu var mı?


44
2018-06-11 13:54


Menşei


Baktınız mı stackoverflow.com/q/27712921/603270 ve stackoverflow.com/a/29329413/603270 ? - shkschneider
Yaptım. Biri AOSP, diğeri ise dinamik sınıflandırma için geçerlidir. Benim durumum aslında çok daha basit. Ancak, içerdiğim başka bir yerel kitaplığın aslında 64 bit .so dosyaları sağladığını keşfettim, bu nedenle son apk'da / lib klasöründe bir arm64-86 klasörü var. Muhtemelen bu, sistemin her durumda 64 bit. Bu kütüphaneyi sadece 32-bit desteğiyle yeniden derlemeye çalışacağım ve işe yarayıp yaramadığına bakacağım. - Philipp E.
İyi düşünmek. Bizi bilgilendirin (gerekirse kendi sorunuza cevap verin). - shkschneider
tools.android.com/tech-docs/new-build-system/user-guide/... - Junior Buckeridge


Cevaplar:


Android'e bir APK yüklediğinizde, sistem, içinde yerel kütüphane dizinleri (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) arar. lib tarafından belirlenen sıraya göre APK klasörü Build.SUPPORTED_ABIS.

Uygulamanızın bir arm64-v8a eksik libs ile dizin, eksik libs başka bir dizinden yüklenmeyecek, lib'lar karışık değil. Bu, her mimari için kütüphanelerinizin tam setini sağlamanız gerektiği anlamına gelir.

Bu nedenle, sorununuzu çözmek için 64 bitlik lib'lerinizi yapınızdan kaldırabilir veya yalnızca 32 bit mimarileri paketlemek için abiFilters'ı ayarlayabilirsiniz:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

119
2018-06-12 09:34



İyi görünüyor, 64-sn klasörler bu snippet ile gitti. Yeniden üretilecek 64 bitlik bir telefon bulabildiğim zaman cevabı kabul edilir olarak işaretleyeceğim - Philipp E.
tools.android.com/tech-docs/new-build-system/user-guide/... - Junior Buckeridge
Hata alıyorum NDK entegrasyonu mevcut eklentide kullanımdan kaldırılmıştır. Yeni deneysel eklentiyi denemeyi düşünün. - Umesh Aawte
eklemek android.useDeprecatedNdk=true projenizin kökünde gradle.properties adlı bir dosyaya. btw, kullanımdan kaldırılmış bir entegrasyon kullanma konusunda kötü hissetmiyor, çünkü abiFilters kullanmak bir APK'nın 64 bitlik lib'lerini filtrelemenin en temiz yolu. - ph0b
@ ph0b müthiş bir çözüm, ama ndk kullanımdan kaldırma bölümü hakkında gerçekten endişe verici ... - Leo K