Android lee el archivo de texto de la carpeta de activos usando C (ndk)

3 minutos de lectura

Necesito leer el archivo de texto de la carpeta de activos en Android, al buscar en Internet encontré que hay una API de asset_manager disponible desde Android 2.3 en adelante. Como estoy apuntando solo a dispositivos de tableta, esto es útil. Pero como no soy experto en lenguaje C, no puedo encontrar ningún ejemplo sobre cómo leer/escribir archivos usando el descriptor de archivos. Encontré muchos ejemplos usando FILE* (punteros de archivo)

Mi objetivo es descifrar un archivo js de la carpeta de activos que está encriptado usando C (para asegurar el código), ya que el código js es visible si el usuario final descompiló mi apk. Debido a que la carpeta de activos está dentro del archivo zip, ¿es posible hacerlo?

avatar de usuario
Sandeep Manne

Aquí está el código que usé para leer el archivo de la carpeta de activos de Android usando asset_manager ndk lib

    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    AAsset* asset = AAssetManager_open(mgr, (const char *) js, AASSET_MODE_UNKNOWN);
    if (NULL == asset) {
        __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, "_ASSET_NOT_FOUND_");
        return JNI_FALSE;
    }
    long size = AAsset_getLength(asset);
    char* buffer = (char*) malloc (sizeof(char)*size);
    AAsset_read (asset,buffer,size);
    __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, buffer);
    AAsset_close(asset);

Se agregó la siguiente línea a mi Android.mk

# for native asset manager
LOCAL_LDLIBS    += -landroid

Y no olvide incluir en el archivo fuente

#include <android/asset_manager.h>

  • ¡Gran respuesta! Me funciona en conjunto con Assimp para cargar modelos 3D. Primero, cargo un archivo en la memoria como se describe arriba, luego paso el búfer a aiImportFileFromMemory

    – j00hola

    22 de agosto de 2014 a las 22:10

  • ¿Puedes ayudarme a averiguar dónde pasaste el nombre del archivo?

    – Nishant

    26 mayo 2015 a las 14:12


  • @Nishant ¿Podría averiguar cómo pasar el nombre del archivo?

    – re3el

    4 de noviembre de 2015 a las 5:56

  • @re3el Lo siento, trabajé en él hace meses y no tengo acceso a los códigos fuente.

    – Nishant

    4 de noviembre de 2015 a las 9:49

  • #incluye para AAssetManager_fromJava

    – Rakib Ansary

    6 de diciembre de 2015 a las 17:52

Prácticamente los descriptores FILE* e ‘int’ son equivalentes y fread/fwrite/fopen/fclose son las contrapartes de las funciones abrir/cerrar/leer/escribir (las funciones son no equivalente sin embargo, estos últimos no son bloqueantes).

Para obtener ‘int’ de ‘ARCHIVO*’ puede usar

int fileno(FILE* f);

en el encabezado y para hacer lo contrario, puede usar fdopen ()

FILE *fdopen(int fd, const char *mode);

Entonces, reemplace todo usando el ARCHIVO * para int o simplemente tome una de las muestras e inserte este código de conversión antes de la lectura del archivo.

  • está bien. En realidad, eso no tiene nada que ver con el NDK, así que si publicas algún código C aquí con el que tienes problemas, la comunidad podrá ayudarte mejor. Buena suerte con la codificación 🙂

    – Viktor Latipov

    2 de mayo de 2012 a las 7:33

Es bastante similar a las funciones regulares de fread/fseek. Aquí está la declaración de la función de lectura:

ssize_t read(int fd, void *buf, size_t count);

se lee de fd descriptor de archivo en buf buffer count bytes Si piensas en fread, entonces en lugar de:

fread(buf, count, size, file);

llamarás:

read(fd, buf, count*size);

Y eso es. Es tan simple.

Buscar también es similar. Simplemente busque la declaración de la función y lea los nombres/descripciones de los argumentos. Será obvio.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad