Jak se dostat na cestu k lib složky pro instalovaný balík

hlasů
9

Sdílené knihovny .so soubory jsou umístěny v lib / armeabi v souboru APK.

Přečetl jsem po pokládce libs dostane extrahované do adresáře / data / data / application_package / lib

Jak mohu získat přesnou cestu k tomuto adresáři v mé žádosti při běhu? Je tento adresář čitelný aplikací? Nebo se jen executeable povolen přístup? Pokud je to čitelné - Je to stále platí i pro kopírování chráněné aplikace?

Položena 08/04/2010 v 22:39
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
29

Přidané v úrovni API 9

getContext().getApplicationInfo().nativeLibraryDir;

Odpovězeno 29/05/2013 v 07:19
zdroj uživatelem

hlasů
11

Můžete získat přesnou cestu s:

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

Adresář a jeho soubory jsou čitelné aplikací.

Oprávnění UNIX jsou nastaveny rwxr-x--x. Takže aplikace se stejnou skupinou může číst soubory.

Odpovězeno 09/01/2011 v 12:23
zdroj uživatelem

hlasů
0

A pokud používáte nativní aktivitu a 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);
Odpovězeno 07/08/2018 v 15:41
zdroj uživatelem

hlasů
0
String libpath = getApplicationInfo().nativeLibraryDir;

Třída použité: dovozní android.content.pm.ApplicationInfo;

Odpovězeno 25/06/2018 v 09:37
zdroj uživatelem

hlasů
0

Možná, že podpora zařízení jiný CPU_ABIs, takže je lepší se dostat nativeRootLibraryDir které obsahují všechny dílčí lib adresáře:

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";
}
Odpovězeno 26/05/2016 v 07:38
zdroj uživatelem

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

Pro lepší kompatibilitu, použijte následující funkce:

@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";
}
Odpovězeno 30/10/2014 v 07:17
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more