2012-01-05 21 views
8

Mi aplicación usa la biblioteca compartida nativa (.so), la estoy cargando llamando al System.loadLibrary("xxx"). Se carga bien y puedo llamar a los métodos nativos.Cómo detectar qué bibliotecas compartidas nativas están cargadas por la aplicación de Android

Me pregunto si hay alguna posibilidad de detectar qué aplicación de bibliotecas compartidas. Intenté listar las bibliotecas cargadas por PackageManager:

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

pero devuelve una lista vacía. Funciona solo si mi aplicación utiliza algunas bibliotecas .jar como com.google.android.maps, que especifico por uses-library en la etiqueta de la aplicación del manifiesto.

¿Cómo puedo listar las bibliotecas .so?

Respuesta

13

La solución es simple, muchas gracias a @ pretoriana-androide

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 este código para enumerar las bibliotecas nativas compartidos que se pueden cargar desde su aplicación:

final File nativeLibraryDir = new File(getApplicationInfo().nativeLibraryDir); 
final String[] primaryNativeLibraries = nativeLibraryDir.list(); 
Cuestiones relacionadas