2010-04-08 203 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"; 
} 
相关问题