2012-01-05 12 views
8

La mia applicazione utilizza la libreria condivisa nativa (.so), la sto caricando chiamando lo System.loadLibrary("xxx"). Si carica bene e posso chiamare i metodi nativi.Come rilevare quali librerie native native sono caricate dall'applicazione Android

Mi chiedo se sia possibile rilevare quale applicazione di librerie condivise utilizza. Ho provato ad elencare le librerie caricate da PackageManager:

PackageManager pm = getPackageManager(); 
String applicationPackage = this.getApplicationInfo().packageName; 
ApplicationInfo ai = pm.getApplicationInfo(applicationPackage, PackageManager.GET_SHARED_LIBRARY_FILES); 
String[] soFiles = ai.sharedLibraryFiles; 

ma restituisce una lista vuota. Funziona solo se la mia applicazione utilizza alcune librerie .jar come com.google.android.maps che specifico per uses-library nel tag dell'applicazione del manifest.

Come posso elencare le librerie .so?

risposta

13

La soluzione è semplice, molte grazie a @ pretorio-droide

try { 
     Set<String> libs = new HashSet<String>(); 
     String mapsFile = "/proc/" + android.os.Process.myPid() + "/maps"; 
     BufferedReader reader = new BufferedReader(new FileReader(mapsFile)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      if (line.endsWith(".so")) { 
       int n = line.lastIndexOf(" "); 
       libs.add(line.substring(n + 1)); 
      } 
     } 
     Log.d("Ldd", libs.size() + " libraries:"); 
     for (String lib : libs) { 
      Log.d("Ldd", lib); 
     } 
    } catch (FileNotFoundException e) { 
     // Do some error handling... 
    } catch (IOException e) { 
     // Do some error handling... 
    } 
1

Usa questo codice per elencare le librerie native condivise che possono essere caricati dalla tua app:

final File nativeLibraryDir = new File(getApplicationInfo().nativeLibraryDir); 
final String[] primaryNativeLibraries = nativeLibraryDir.list(); 
Problemi correlati