2010-04-08 2 views
9

Les bibliothèques partagées Les fichiers .so sont placés dans lib/armeabi dans un fichier apk.Comment obtenir le chemin d'accès au dossier lib pour un package installé

J'ai lu après l'installation du libs s'extrait à/data/data/application_package/lib

Comment puis-je obtenir le chemin exact de ce répertoire dans ma demande au moment de l'exécution? Ce répertoire est-il lisible par l'application? Ou est seulement l'accès exécutable autorisé? S'il est lisible - Cela est-il toujours vrai pour les applications protégées contre la copie?

Répondre

11

Vous pouvez obtenir le chemin exact avec:

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

Le répertoire et les fichiers sont lisibles par l'application. Les autorisations UNIX sont définies sur . Ainsi, les applications avec le même groupe peuvent lire les fichiers.

+6

Et pendant que nous y sommes, il y a ApplicationInfo.nativeLibraryDir :-) – Ilya

28

Ajouté au niveau de l'API 9

getContext().getApplicationInfo().nativeLibraryDir;

0
String libraryPath = context.getFilesDir().getParentFile().getPath() + "/lib"; 

Pour une meilleure compatibilité, utilisez la fonction suivante:

@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

Etes-vous sûr que vous pouvez charger des bibliothèques natives à partir de cet emplacement? – lhunath

+0

Oui, je l'ai vérifié dans mon application. Quel est le problème? – Verdigrass

+0

Ne fonctionne pas sur HTC M9 + fonctionnant 5.1.1. Le lien lib est là, mais ne pointe pas vers le bon répertoire. La solution de Crossie le fait (getContext(). GetApplicationInfo(). NativeLibraryDir;) – kshepherd

0

Peut-être un support de périphérique différent CPU_ABIs, il est donc préférable d'obtenir nativeRootLibraryDir qui contiennent tous les sous-répertoires lib:

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"; 
} 
Questions connexes