How to get the path to the lib folder for an installed package

后端 未结 6 2044
自闭症患者
自闭症患者 2020-12-14 03:40

Shared libraries .so files are placed in lib/armeabi in an apk file.

I have read after installation the libs gets extracted to /data/data/application_package/lib

相关标签:
6条回答
  • 2020-12-14 04:17

    Maybe a device support different CPU_ABIs, so it's better to get nativeRootLibraryDir which contain all sub lib directories:

    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";
    }
    
    0 讨论(0)
  • 2020-12-14 04:18

    Added in API level 9

    getContext().getApplicationInfo().nativeLibraryDir;

    0 讨论(0)
  • 2020-12-14 04:25

    You can get the exact path with:

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

    The directory and its files are readable by the application.

    The unix permissions are set to rwxr-x--x. So applications with the same group can read the files.

    0 讨论(0)
  • 2020-12-14 04:29

    And if you're using a native activity and C++:

    void ANativeActivity_onCreate(ANativeActivity* app, void*, size_t) {
        const jclass contextClass = app->env->GetObjectClass(app->clazz);
        const jmethodID getApplicationContextMethod =
            app->env->GetMethodID(contextClass, "getApplicationContext", "()Landroid/content/Context;");
        const jobject contextObject =
            app->env->CallObjectMethod(app->clazz, getApplicationContextMethod);
        const jmethodID getApplicationInfoMethod = app->env->GetMethodID(
            contextClass, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;");
        const jobject applicationInfoObject =
            app->env->CallObjectMethod(contextObject, getApplicationInfoMethod);
        const jfieldID nativeLibraryDirField = app->env->GetFieldID(
            app->env->GetObjectClass(applicationInfoObject), "nativeLibraryDir", "Ljava/lang/String;");
        const jobject nativeLibraryDirObject =
            app->env->GetObjectField(applicationInfoObject, nativeLibraryDirField);
        const jmethodID getBytesMethod = app->env->GetMethodID(
            app->env->GetObjectClass(nativeLibraryDirObject), "getBytes", "(Ljava/lang/String;)[B");
        const auto bytesObject = static_cast<jbyteArray>(app->env->CallObjectMethod(
            nativeLibraryDirObject, getBytesMethod, app->env->NewStringUTF("UTF-8")));
        const size_t length = app->env->GetArrayLength(bytesObject);
        const jbyte* const bytes = app->env->GetByteArrayElements(bytesObject, nullptr);
        const std::string libDir(reinterpret_cast<const char*>(bytes), length);
    
    0 讨论(0)
  • 2020-12-14 04:42
    String libraryPath = context.getFilesDir().getParentFile().getPath() + "/lib";
    

    For better compatibility, use the following function:

    @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 讨论(0)
  • 2020-12-14 04:44
    String libpath = getApplicationInfo().nativeLibraryDir;
    

    Class used: import android.content.pm.ApplicationInfo;

    0 讨论(0)
提交回复
热议问题