2010-04-08 202 views
9

共享庫.so文件放在lib/armeabi中的apk文件中。如何獲取安裝包的lib文件夾的路徑

我安裝庫被提取到/數據/數據後,已讀/ application_package/lib目錄

如何我能得到這個目錄的確切路徑,我在運行時應用程序? 該目錄是否可以被應用程序讀取?或者只允許執行訪問? 如果它是可讀的 - 對於受版權保護的應用程序,這仍然是真的嗎?

回答

11

您可以得到確切的路徑:

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

目錄及其文件是由應用程序讀取。

unix權限設置爲rwxr-x--x。因此,與同組的 應用程序可以讀取這些文件。

+6

雖然我們在這,但還是有ApplicationInfo.nativeLibraryDir :-) – Ilya 2012-08-23 22:56:21

28
在API層面

新增9

getContext().getApplicationInfo().nativeLibraryDir;

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

爲了更好的兼容性,可以使用下面的功能:

@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

您確定可以從此位置加載本機庫嗎? – lhunath 2015-07-07 16:02:18

+0

是的,我在我的應用程序中檢查過它。問題是什麼? – Verdigrass 2015-07-21 09:25:29

+0

在運行5.1.1的HTC M9 +上不起作用。 lib鏈接在那裏,但不指向正確的目錄。 Crossie的解決方案(getContext()。getApplicationInfo()。nativeLibraryDir;) – kshepherd 2016-02-04 14:58:58

0

也許一個設備支持不同CPU_ABIs,所以最好讓nativeRootLibraryDir其中包含所有子庫目錄:

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"; 
} 
相關問題