2012-01-05 75 views
8

我的應用程序使用本機共享庫(.so),我通過調用System.loadLibrary("xxx")加載它。它加載得很好,我可以調用本地方法。如何檢測Android應用程序加載了哪些本機共享庫

我不知道是否有任何可能性來檢測哪些共享庫應用程序使用。我試圖通過PackageManager列出加載庫:

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

但它返回一個空列表。它只適用於我的應用程序使用一些.jar庫,如com.google.android.maps,我在清單的應用程序標記中指定了uses-library

如何列出.so庫?

回答

13

解決方法很簡單,非常感謝@執政官,機器人

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

使用此代碼列出可以從您的應用程序加載的共享本機庫:

final File nativeLibraryDir = new File(getApplicationInfo().nativeLibraryDir); 
final String[] primaryNativeLibraries = nativeLibraryDir.list(); 
相關問題