2010-04-08 14 views
9

Paylaşılan kitaplıklar .so dosyaları bir apk dosyasında lib/armeabi'ye yerleştirilir.Yüklü bir paket için lib klasörüne giden yol nasıl oluşturulur

Ben libs/veri/verilere ayıklanır kurulumdan sonra okudum/application_package/lib

nasıl çalışma zamanında benim uygulamada bu dizine tam yolunu alabilirim? Bu dizin uygulama tarafından okunabilir mi? Veya sadece yönetici erişimine izin var mı? Okunabilirse - Bu kopya korumalı uygulamalar için geçerli mi?

cevap

11

Sen ile kesin yolunu alabilirsiniz:

String libraryPath = getContext().getApplicationInfo().dataDir + "/lib"; 

dizin ve dosyaları uygulama tarafından okunabilir.

Unix izinleri rwxr-x--x olarak ayarlanmıştır. Yani ile aynı gruptaki uygulamalar dosyaları okuyabilir. API düzeyinde

+6

Ve biz işteyken, ApplicationInfo.nativeLibraryDir :-) var – Ilya

28

Eklendi 9

getContext().getApplicationInfo().nativeLibraryDir;

daha iyi uyumluluk için
0
String libraryPath = context.getFilesDir().getParentFile().getPath() + "/lib"; 

, aşağıdaki işlevi kullanın:

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 
public static String getLibraryDirectory(Context context) { 
    int sdk_level = android.os.Build.VERSION.SDK_INT; 

    if (sdk_level >= Build.VERSION_CODES.GINGERBREAD) { 
     return context.getApplicationInfo().nativeLibraryDir; 
    } 
    else if (sdk_level >= Build.VERSION_CODES.DONUT) { 
     return context.getApplicationInfo().dataDir + "/lib"; 
    } 

    return "/data/data/" + context.getPackageName() + "/lib"; 
} 
+0

Yerel kütüphaneleri bu konumdan yükleyebileceğinizden emin misiniz? – lhunath

+0

Evet, uygulamanızda kontrol ettim. Sorun nedir? – Verdigrass

+0

HTC M9 + 5.1.1 üzerinde çalışıyor. Lib bağlantısı var, ancak doğru dizine işaret etmiyor. Crossie'nin çözümü (getContext(). GetApplicationInfo(). NativeLibraryDir;) – kshepherd

0

Belki bir cihaz desteği değişik CPU_ABIs, bu nativeRootLibraryDir ölmek daha iyi bu yüzden tüm alt lib dizinlerini içerenler:

public static String getNativeLibraryDirectory(Context context) { 
    int sdk_level = android.os.Build.VERSION.SDK_INT; 

    if (sdk_level >= Build.VERSION_CODES.GINGERBREAD) { 
     try { 
      String secondary = (String) ApplicationInfo.class.getField("nativeLibraryRootDir").get(context.getApplicationInfo()); 
      return secondary; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    else if (sdk_level >= Build.VERSION_CODES.DONUT) { 
     return context.getApplicationInfo().dataDir + "/lib"; 
    } 

    return "/data/data/" + context.getPackageName() + "/lib"; 
} 
İlgili konular