2011-06-06 22 views
11

Bir Android projesinde çalışıyorum ve yerel yöntemleri çağırmak için NDK'yı kullanıyorum. İki kitaplığım (.so dosyası) var ve bir tane libs/armeabi klasöründe, diğeri ise libs/armeabi-v7a lib klasöründe bulunuyor.armeabi and armeabi-v7a klasörü

Uygulamayı çalıştırmayı denerseniz, kitaplığı /libs/armeabi klasörüne yüklemez. Kütüphane dosyasını libs/armeabi-v7a klasörüne taşırsam, kütüphaneyi yükler ancak 5 ila 10 dakika sonra çöker ve bölümleme hatası hatası verir.

Kitaplığın (farklı klasör) konumunun bu soruna neden olup olmayacağını merak ediyordum.

+1

hey .. bunu çözdünüz mü? bir kuşkum var. armv7-a arch için ffmpeg yapıyorum. onu armeabi cihazlarda kullanabilir miyim? Ben yeniyim. Armv7-çapraz derlenmiş için inşa ettik. –

cevap

-5

Kendim için yeniyim ama aynı yoldan gidiyorum ... bildiğim kadarıyla, sadece bir tek paylaşılan kütüphanesi olabilir; çeşitli kütüphaneleri kullanmak, onları statik yapmak ve bunları tek bir paylaşıma bağlamak. Tabii ki, bu, kütüphaneleri kendiniz inşa ettiğinizi varsayar ;-)

+1

Bu doğru değil. Birden fazla paylaşılan kütüphaneye sahip olmak oldukça olasıdır, ancak yanlış anlaşılması ve problem yaşaması kolay olan ekstra karmaşıklığı beraberinde getirmektedir. – tomwhipple

5

Kütüphane yükleyicisi, üzerinde çalıştığınız mimariyle en yakından eşleşen kitaplıkları aramaya çalışır. Genelde, derleyicinin doğru bir şekilde optimize edebilmesi için desteklemeyi planladığınız her bir abis için kütüphanenin bir sürümünü (armeabi, armeabi-v7a, x86, mips) derlemelisiniz.

Dizin yapısı, hangi lib'in yükleneceğini Android için nasıl belirlediğidir, bu yüzden değiştirmemeniz kritik önem taşır.

19

bir uygulama yüklerken, paket yöneticisi hizmet .apk tarama ve formun herhangi bir paylaşılan kütüphane için bakacağız: Bir bulunursa

 lib/<primary-abi>/lib<name>.so 

, o zaman $ APPDIR altında kopyalanır/lib/lib.so, $ APPDIR uygulamanın özel veri dizinine karşılık gelir.

hiçbiri bulunur ve ikincil ABI tanımlanırsa, hizmet sonra formun paylaşılan kütüphaneler için tarar:

şey bulunursa
lib/<secondary-abi>/lib<name>.so 

, o zaman $ APPDIR altında kopyalanır/lib/lib.so. Birincil/İkincil abi için

,

Android sistem ABI (ler) desteklediği zamanında bilir. Daha açık bir şekilde, en fazla iki yapı özgü sistem özelliklerini belirtmek için kullanılır: Sistem, görüntünün içine kullanılan makina koduna karşı gelen cihaz için

  • 'primer' ABI. Sistem görüntüsü tarafından da desteklenen başka bir ABI'ye karşılık gelen isteğe bağlı bir "ikincil" ABI olan

Örneğin, tipik bir ARMv5TE bazlı cihaz sadece 'armeabi' primer ABI tanımlar ve bir ikinci bir tanımlamak olmaz. Diğer yandan, tipik bir ARMv7 tabanlı aygıt, birincil ABI'yı 'armeabi-v7a' ve ikincil olanı 'armeabi' olarak tanımlayacaktır, çünkü her ikisi için oluşturulan uygulama yerel ikili dosyalarını çalıştırabilmektedir.

Bu mekanizma, hedeflenen aygıt için en iyi makine kodunun yükleme sırasında otomatik olarak paketten çıkarılmasını sağlar.

+0

Armeabi kütüphaneleri armeabi-v7a ile doğrudan uyumlu mu? Yani - kütüphanelerinizi klasör kolundan armeabi-v7a klasörüne taşırsanız işe yarayacak mı? Bu, sadece armeabi'de mevcut olan kütüphaneleri kullanıyorsa ve aynı zamanda sadece armeabi-v7a'da bulunan kütüphaneleri kullanmak istiyorsa yapacağı bir şeydir. – Stan

+1

@Stan armeabi kütüphaneleri v7a cihazlarında çalışabilir. – loveisbug

+1

Teşekkürler, bunu biliyorum. Armeabi kütüphanesi (armeabi-v7a cihazında) yerine armeabi-v7a klasörüne yerleştirilirse, bir armeabi kütüphanesinin fazladan bir şey bekleyip beklemeyeceğini merak ediyordum. Cihazın armeabi-v7a için tasarlandığını düşünürse, bazı durumlarda çökebileceğini düşündüm. – Stan